Java 8 이후의 Interface 특징
- 인스턴스를 생성할 수 없고 상수만 가질 수 있다.
- 메서드 body가 없는 추상 메서드를 가진다.
- *디폴트 메서드, static 메서드만 가질 수 있다. (JDK 1.8 이상)
* 디폴트 메서드 => 인터페이스에서 메서드 body를 가지는 메서드, 반드시 오버라이드할 필요는 없음, public 접근 제어자
인터페이스를 써야 하는 이유
- 다이아몬드 문제(다중 상속 시, 부모 클래스에 같은 시그니처의 메서드가 있을 때, 어떤 메서드를 상속받아야 하는지 판별할 수 없는 문제) => 인터페이스의 추상 메서드는 구체적인 선언부가 없기 때문에 모호함이 발생하지 않음
- 공통의 조상을 갖지 않는 두 클래스에 관계를 맺어줄 수 있음
- 사용자 입장에서는 내부적 구조에 대한 이해 없이 약속된 행위가 보장됨
인터페이스 대신 추상 클래스(상속)를 사용하는 경우
- 굉장히 밀접하게 연관된 클래스들끼리 코드를 공유해야 할 때
- 추상 클래스의 하위 구현체 클래스들이 공통된 필드나 메서드를 많이 공유하고, 접근 제어자가 public이 아닌 경우
- Non-static 혹은 non-final의 필드로 객체의 상태를 바꿔야 하는 경우
추상 클래스 대신 인터페이스를 사용하는 경우
- 관련이 없는 클래스들끼리 관계를 맺어줄 때
- 특정 데이터 타입의 동작을 지정하려고 하지만 해당 동작을 누가 구현하는지는 중요하지 않을 때
- 다중 상속이 필요할 때
Skeletal Implementation
인터페이스를 직접 구현하면 접근 제어자가 모두 public이기 대문에 은닉이 힘듦 => 추상 골격 클래스는 private, protected가 가능하므로 오버라이드한 메서드의 내부 메서드들을 클라이언트가 접근하지 못하도록 막을 수 있다.
인터페이스 사용 시 유의점
- 디폴트 메서드는 런타임 오류를 일으킬 수 있다.
- 이미 구현된 인터페이스에 디폴트 메서드를 추가하는 것은 신중히 해야 한다.
- 디폴트 메서드를 추가하려면 릴리즈 전에 반드시 테스트를 거쳐야 한다.
'공부 기록 > 영상 후기' 카테고리의 다른 글
[10분 테코톡] 우기의 MySQL 아키텍처 (0) | 2023.05.05 |
---|---|
[10분 테코톡] 수리의 TCP/IP (0) | 2023.05.05 |
[10분 테코톡] 작은곰의 Spring Security (0) | 2023.05.05 |
[10분 테코톡] 루피의 인증과 인가 (0) | 2023.05.05 |
GPU는 어떻게 작동할까 (0) | 2023.05.05 |