[아이템 22] 인터페이스는 타입을 정의하는 용도로만 사용하라

Jimin Lim·2022년 5월 30일
0

Effective Java

목록 보기
22/38
post-thumbnail
post-custom-banner

아이템 22

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

인터페이스

자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 즉, 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지 클라이언트에 얘기해주는 것이다.
인터페이스는 오직 이 용도로만 사용해야 한다.

상수 인터페이스

지침에 맞지 않는 예로 상수 인터페이스가 있다.

  • 상수 인터페이스: 메서드 없이 상수를 뜻하는 static final 필드만 있는 인터페이스
public interface PhysicalConstants {
	//타이핑하기 귀찮아서 대충 적음... 암튼 static final 필드만 있는 것
    static final double AVOGADROS_NUMBER = 6.022;
    static final double BOLTZMANN_CONSTANT = 1.38;
}

클래스 내부에서 사용하는 상수는 내부 구현에 해당하며, 상수 인터페이스를 구현한다는 것은 내부 구현을 API로 노출하는 행위이므로 잘못된 사용이다.
또한 final이 아닌 클래스가 상수 인터페이스를 구현한다면 모든 하위 클래스의 namespace가 그 인터페이스로 정의한 상수들로 오염되어 버린다.

상수 공개

상수를 공개하기 위한 대안은 다음과 같다.

클래스나 인터페이스 자체에 추가

  • 특정 클래스나 인터페이스와 강하게 연관된 상수라면 그 클래스나 인터페이스 자체에 추가해야 한다. 대표적으로, Integer와 Double에 정의된 MAX_VALUE, MIN_VALUE가 있다.

Enum

  • 열거 타입으로 나타내기 적합하다면 열거 타입으로 만들어 공개하면 된다.

상수 유틸리티 클래스 제공

  • 인스턴스화할 수 없는 유틸리티 클래스에 담아 공개한다. 이 클래스에 정의된 상수는 클라이언트에서 사용할 때 클래스 이름까지 명시해야 한다. PhysicalConstants.AVOGADROS_NUMBER 처럼 말이다.
public class PhysicalConstants {
    private PhysicalConstants() {} //인스턴스화 방지
    
    static final double AVOGADROS_NUMBER = 6.022;
    static final double BOLTZMANN_CONSTANT = 1.38;
}

정리

인터페이스는 타입을 정의하는 용도로만 사용해야 한다. 상수 공개용 수단으로 사용하지 말자.

profile
💻 ☕️ 🏝 🍑 🍹 🏊‍♀️
post-custom-banner

0개의 댓글