-
클래스와 인터페이스 - 아이템 22. 인터페이스는 타입을 정의하는 요도로만 사용하라Study/Effective Java 2022. 12. 26. 16:32
인터페이스는 타입을 정의하는 요도로만 사용하라
인터페이스의 용도
인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 즉, 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것이다. 인터페이스는 오로지 이 용도로만 사용돼야 한다.
인터페이스의 잘못된 사용
public interface PhysicalConstants { static final double AVOGADROS_NUMBER = 6.022_140_857e23; static final double BOLZMANN_CONSTANT = 1.380_648_52e-23; static final double ELECTRON_MASS = 9.109_383-56e-31; }
위에서 언급한 용도에 맞지 않는 예로 소위 상수 인터페이스라는 것이 있다. 상수 인터페이스란 메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스를 말한다. 그리고 이 상수들을 사용하려는 클래스에서는 정규화된 이름을 쓰는 걸 피하고자 그 인터페이스를 구현하곤 한다.
상수 인터페이스를 사용하지 말아야 하는 이유
1. 사용하지 않을 수도 있는 상수를 포함하여 모두 가져오기 때문에 계속 가지고 있어야 한다.
2. 클라이언트가 상수 인터페이스 값에 직접 접근할 수 있다. 이때, 불필요한 정보를 노출하는 것이 오히려 클라이언트에게 혼란을 야기할 수 있다.
3. 클래스가 어떤 상수 인터페이스를 사용하든 사용자에게는 아무런 의미가 없다.
4. 열거형 상수를 표현하기에 서툴다.
5. 바이너리 호환성을 위해 추후에 해당 상수들이 사용되지 않더라도 인터페이스를 구현해야 한다.
6. 인터페이스란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할을 담당하는 것인데, 이를 상수를 위해 사용하는 것은 인터페이스를 올바르게 사용하는 것이 아니게 된다.
상수 인터페이스의 대안
상수를 공개할 목적이라면 더 합당한 선택지가 몇 가지 있다.
1. 클래스나 인터페이스 자체에 추가
public final class Integer extends Number implements Comparable<Integer> { @Native public static final int MIN_VALUE = 0x80000000; @Native public static final int MAX_VALUE = 0x7fffffff; }
특정 클래스나 인터페이스와 강하게 연관된 상수라면 그 클래스나 인터페이스 자체에 추가해야 한다. Integer와 Double에 선언된 MIN_VALUE와 MAX_VALUE 상수가 이런 예이다.
2. Enum 활용
public enum PlayerResult { WIN("승"), DRAW("무"), DEFEAT("패"); private final String name; PlayerResult(final String name) { this.name = name; } }
열거 타입으로 나타내기 적합한 상수라면 열거 타입으로 만들어 공개하면 된다.
3. 상수 유틸리티 클래스 제공
public class PhysicalConstants { private PhysicalConstants() { } // 인스턴스화 방지 static final double AVOGADROS_NUMBER = 6.022_140_857e23; static final double BOLZMANN_CONSTANT = 1.380_648_52e-23; static final double ELECTRON_MASS = 9.109_383-56e-31; }
인스턴스화할 수 없는 유틸리티 클래스에 담아 공개하는 것도 좋은 방법이다. 위 코드는 앞에서 보여준 PhysicalConstants의 유틸리티 클래스 버전이다.
최종 정리
인터페이스는 타입을 정의하는 용도로만 사용해야 한다. 상수 공개용 수단으로 사용하지 말아야 한다.
출처
ㆍ 이펙티브 자바 Effective Java 3/E. 조슈아 블로크 저자(글) · 개앞맵시(이복연) 번역
728x90'Study > Effective Java' 카테고리의 다른 글
클래스와 인터페이스 - 아이템 24. 멤버 클래스는 되도록 static으로 만들라 (0) 2022.12.27 클래스와 인터페이스 - 아이템 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) 2022.12.26 클래스와 인터페이스 - 아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라 (0) 2022.12.26 클래스와 인터페이스 - 아이템 20. 추상 클래스보다는 인터페이스를 우선하라 (0) 2022.12.21 클래스와 인터페이스 - 아이템 19. 상속을 고려해 설계하고 문서화하라, 그러지 않았다면 상속을 금지하라 (0) 2022.12.21