본문 바로가기

공부 기록/영상 후기

[10분 테코톡] 알파의 인터페이스

https://youtu.be/T1BJzC9xb0g

Java 8 이후의 Interface 특징

- 인스턴스를 생성할 수 없고 상수만 가질 수 있다.

- 메서드 body가 없는 추상 메서드를 가진다.

- *디폴트 메서드, static 메서드만 가질 수 있다. (JDK 1.8 이상)

* 디폴트 메서드 => 인터페이스에서 메서드 body를 가지는 메서드, 반드시 오버라이드할 필요는 없음, public 접근 제어자

  

인터페이스를 써야 하는 이유

- 다이아몬드 문제(다중 상속 시, 부모 클래스에 같은 시그니처의 메서드가 있을 때, 어떤 메서드를 상속받아야 하는지 판별할 수 없는 문제) => 인터페이스의 추상 메서드는 구체적인 선언부가 없기 때문에 모호함이 발생하지 않음

- 공통의 조상을 갖지 않는 두 클래스에 관계를 맺어줄 수 있음

- 사용자 입장에서는 내부적 구조에 대한 이해 없이 약속된 행위가 보장됨

  

인터페이스 대신 추상 클래스(상속)를 사용하는 경우

- 굉장히 밀접하게 연관된 클래스들끼리 코드를 공유해야 할 때

- 추상 클래스의 하위 구현체 클래스들이 공통된 필드나 메서드를 많이 공유하고, 접근 제어자가 public이 아닌 경우

- Non-static 혹은 non-final의 필드로 객체의 상태를 바꿔야 하는 경우

  

추상 클래스 대신 인터페이스를 사용하는 경우

- 관련이 없는 클래스들끼리 관계를 맺어줄 때

- 특정 데이터 타입의 동작을 지정하려고 하지만 해당 동작을 누가 구현하는지는 중요하지 않을 때

- 다중 상속이 필요할 때

  

Skeletal Implementation

인터페이스를 직접 구현하면 접근 제어자가 모두 public이기 대문에 은닉이 힘듦 => 추상 골격 클래스는 private, protected가 가능하므로 오버라이드한 메서드의 내부 메서드들을 클라이언트가 접근하지 못하도록 막을 수 있다.

  

인터페이스 사용 시 유의점

- 디폴트 메서드는 런타임 오류를 일으킬 수 있다.

- 이미 구현된 인터페이스에 디폴트 메서드를 추가하는 것은 신중히 해야 한다.

- 디폴트 메서드를 추가하려면 릴리즈 전에 반드시 테스트를 거쳐야 한다.