Java

[Effective Java] 4-3. 클래스와 인터페이스: 인터페이스

noahkim_ 2024. 12. 27. 21:15

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.


1. 추상 클래스보다는 인터페이스를 우선하라

추상클래스

상속을 통한 재사용
  • 기본적인 구현을 제공
  • 일부 메서드를 abstract로 선언하여 하위 클래스가 이를 구현하도록 요구
  • 추상클래스가 정의한 타입을 구현한는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 함

 

인터페이스

믹스인 정의
  • 주된 기능에 선택적 기능을 혼합
  • 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해 추가 가능

 

계층구조가 없는 타입 프레임워크 생성 가능
  • 인터페이스가 선언한 메서드를 정의하고 규약을 지킨다면 어떤 클래스를 확장했던 같은 타입
  • 현실세계의 다양한 모델을 표현하는데 유용

 

2. 인터페이스는 구현하는 쪽을 생각해 설계하라

디폴트 메서드

  • 인터페이스 메서드의 기본 구현을 제공하는 기능
  • Java 8에서 도입됨

 

예외 발생 가능성

  • 컴파일에 성공하더라도 기존 구현체에 런타임 오류를 일으킬 수 있음

 

Collection.removeIf()
  • org.apache.commons.collections4.collection.SynchronizedCollection
    • 동기화 컬렉션
    • 클라이언트가 제공한 객체로 락을 거는 기능을 가짐
  • removeIf는 동기화에 관해 아무것도 모름
    • 재정의하지 않는다면 동기화가 되지 않음
  • 서브 클래스에 removeIf()를 재정의하도록 하였음

 

3. 인터페이스는 타입을 정의하는 용도로만 사용하라

  • 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할