-
JAVA - 3study/java 2020. 7. 16. 19:00
final keyword
1. final
(1) 기본형 변수 : 값 변경 불가. 초기값을 지정해주어야 함
(2) 참조형 변수 : 한번 인스턴스를 생성하면 다른 인스턴스를 생성할 수 없음
(3) 메소드 : 해당 메소드를 포함한 클래스를 상속받아도 final keyword가 사용된 메소드는 오버라이딩 금지
(4) 클래스 : 해당 클래스를 누구도 상속 받을 수 없음
2. finally
try, catch 문에서 항상 마지막에 수행되는 블록
3. finalize
객체의 메모리를 반환하는 메소드. 실행하면 GC가 메모리를 반환
Overriding vs Overloading
Overriding
부모의 메서드를 재정의.
왜 사용 ? 자식 클래스에 맞게 메서드의 내용을 변경해야하는 경우에 사용한다.
Overloading
같은 이름의 메서드를 파라미터를 다르게 하여 정의
왜 사용 ? 동일한 기능을 하는 메서드를 다양한 입력값을 받아서 실행하도록 하기 위해서
접근 제어자
- public : 외부의 모든 접근을 허락
- private : 클래스 내의 접근만을 허락
- protected : '부모-자식 관계'와 '같은 패키지 내'에서만 허락
- default : 같은 패키지만 허락
왜 사용 ?
외부의 접근으로부터 데이터를 보호하거나 굳이 보여줄 필요가 없는 정보나 내부적으로만 사용되는 정보를 감추기 위해서 사용
추상 클래스 vs 인터페이스
차이점
- 추상 클래스는 클래스 내에 추상 메소드가 하나 이상 포함되거나 abstract으로 정의된 경우, 인터페이스는 모든 메소드가 추상메소드인 경우(함수의 껍데기만 있는 뼈대의 의미)
- 둘다 강제적으로 상속받게 하는데 추상 메소드만 강제 상속. 추상 클래스의 일반 메소드는 상속 강제 아님
공통점
- 자식 클래스들의 공통적인 기능을 묶어 정의한다는 의미를 가짐
목표
공통점
차이점
추상 클래스
기능을 확장
인스턴스 생성이 안됨
- 기능을 확장하기 위해 사용
- 추상 메소드와 일반 메소드 모두 정의 가능
- 단일 상속만
인터페이스
기능을 구현
(구현 객체가 같은 동작을 한다는 것을 보장)
- 기능을 구현하기 위해 사용
- 추상 메소드와 디폴트 메소드로 정의가 가능
- 다중 상속 가능
디폴트 메서드
: 인터페이스에서 메서드앞에 default 키워드를 사용하게 되면 인터페이스 내부에서도 코드가 포함된 메서드를 선언할 수 있다.
접근제어자의 default는 아무것도 명시하지 않으면 되고 인터페이스의 default는 default를 명시해주어야 한다.
왜 사용?
기존에 존재하던 인터페이스에 새로운 내용을 추가하거나 기존의 내용을 변경하게 되면 그 인터페이스를 구현하는 클래스들에 지장을 주게 된다. default 메서드를 사용하면 클래스들과의 호환성을 유지시키면서 인터페이스를 변경할 수 있다.
인터페이스를 사용하는 이유 ( 장점 )
1. 개발 시간 단축
개발자들이 각각의 부분을 완성할 때까지 기다리지 않고 서로 규약을 정해놓고 각자의 부분만 따로 나누어 작성된 코드를 컴파일할 수 있음
2. 표준화 가능
클래스의 기본틀을 제공하여 개발자들이 정형화된 개발을 할 수 있도록 함
3. 서로 관계없는 클래스간에 관계를 맺어줄 수 있음
코드의 중복성을 줄이고 유지보수성을 높여서 클래스 간의 쓸데없는 상속을 방지
4. 독립적인 프로그래밍 가능
두 클래스가 같은 인터페이스를 구현하고 있을 때 한 클래스를 변경하여도 나머지 한 클래스에 영향을 미치지 않음
추상 클래스와 인터페이스의 적절한 사용 케이스
추상클래스
- 관련성이 높은 클래스 간에 코드를 공유하고 싶은 경우
- 추상 클래스를 상속받은 클래스들이 공통으로 가지는 메소드와 필드가 많거나, public 이외의 접근 제어자 사용이 필요한 경우
- non-static, non-final 필드 선언이 필요한 경우. 즉 각 인스턴스에서 상태 변경을 위한 메소드를 선언할 수 있음
인터페이스
- 서로 관련성이 없는 클래스들이 인터페이스를 구현하게 되는 경우에 사용. 예를 들어 Comparable, Cloneable 인터페이스는 여러 클래스에서 구현되는데 구현 클래스들 간에 관련성이 없는 경우가 대부분.
- 특정 데이터 타입의 행동을 명시하고 싶은데 어디서 그 행동이 구현되는지는 신경쓰지 않는 경우
- 다중 상속을 허용하고 싶은 경우
추상클래스의 추상메소드와 일반 메소드
공통적인 기능 -> 슈퍼클래스(추상클래스)의 일반 함수로 구현
개별 기능/ 슈퍼클래스로도 동작이 가능한 기능 -> 슈퍼클래스의 추상함수 ( 서브 클래스에서 구현 )
서브 클래스만의 기능 -> 서브 클래스의 일반 함수로 구현
※ 클래스 다중 상속이 안되는 이유는?
다중 상속이 가능하면 충돌이 생긴다.
예를 들어 run() 이라는 메소드를 가지고 있는 A클래스와 B클래스를 다중 상속받은 C 클래스가 있다고 가정하자.
C클래스 입장에서 A 클래스의 run() 메소드를 오버라이드할지, B 클래스의 run()메소드를 오버라이드할지 충돌이 발생하게 된다.
추상메소드와 인터페이스 관련 잘읽히는 블로그
'study > java' 카테고리의 다른 글
[JAVA] Try-with-resources (0) 2020.07.30 JAVA - 5 (0) 2020.07.20 JAVA - 4 ( 객체지향 ) (0) 2020.07.16 JAVA - 2 (변수타입과 컬렉션) (0) 2020.07.15 JAVA - 1 ( JAVA 기초 ) (0) 2020.07.13