인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다.
달리 말하면 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스를 무엇을 할 수 있는지를 클라이언트에게 애기해주는 것이다.
인터페이스는 반드시 위 용도로만 사용이 되어야 한다.
상수 인터페이스는 메서드없이 상수를 뜻하는 static final 필드로만 구성된 인터페이스를 말한다.
이 상수들을 사용하려는 클래스에서는 정규화된 이름을 쓰는 걸 피하고자 그 인터페이스를 구현하곤 한다.
public interface Test {
public static final String TEST_1 = "테스트1";
public static final String TEST_2 = "테스트2";
}
상수 인터페이스 안티패턴으로 인터페이스를 잘못 사용한 예다.
클래스 내부에서 사용하는 상수는 내부구현에 해당한다.
따라서 상수 인터페이스를 구현하는 것은 이 내부 구현을 클래스의 API로 노출하는 행위이다.
클래스가 어떤 상수 인터페이스를 사용하던 사용자에게는 아무런 의미가 없고 오히려 혼란을 주게된다.
동시에 클라이언트 코드가 이 상수들에 종속되어 다음 릴리스에서 상수를 사용하지 않게 되더라도 여전히 상수 인터페이스를 implements 해야 한다.
올바른 상수 공개의 몇가지 방법이다.
1. 클래스나 인터페이스 자체에 추가
2. 열거 타입으로 공개
3. 유틸리티 클래스에 담아 공개
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,MAX_VALUE가 있다.
또는 Enum을 사용하던가,
생성자를 private로 만들고 public static final 필드를 만들어서 유틸리티 클래스에 담아 사용하면 된다.
유틸리티 클래스를 사용하면 정적 import를 통해 클래스 이름을 생략해서 사용할 수 있다.
- 인터페이스가 타입을 정의하는 용도로만 사용해야 하는 이유는 무엇인가요?
인터페이스에 상수를 정의하면 내부 구현을 클래스 API로 공개하게 된다.
또한, 인터페이스는 특정 타입을 정의하는 용도로 사용되는데, 이를 벗어나는 다른 기능을 추가하면 인터페이스의 역할이 모호해지고
이를 구현하는 클래스들 사이의 일관성이 떨어지게 되기 때문이다.
- 이 원칙을 따르지 않고 인터페이스를 다른 목적으로 사용할 경우 어떤 문제가 발생할 수 있나요?
인터페이스를 다른 목적으로 사용하면 코드의 확장성이 제한될 수 있다.
타입을 정의하는 용도 외로 사용하면 새로운 동작을 추가하기 위해 기존 인터페이스를 수정해야 할 수도 있다.
또한, 일관성이 훼손되어 클라이언트 코드들이 예기치 않은 동작을 보일 수 있고, 이를 구현한 클래스들이 다양한 동작을 제공하게 되어
코드의 가동성을 해칠 수 있다.
자바이펙티브를 공부하던 것을 본 같은 팀에 시니어께서 제대로 공부했는지 확인해볼까? 하고 아이템 하나를 집어서 질문을 하셨는데
제대로 대답하질 못했다. 분명 포스팅을 하면서 이해하려고 한참 시간을 썻던 아이템이였는데 정작 말로 하려니 대답이 나오질 않았다.
말로 할 수 있어야 이해가 된 거라던 말씀을 듣고 아이템 마지막에 질문을 던지고 대답해보기로 했다.
'JAVA > 이펙티브 자바' 카테고리의 다른 글
24. 멤버 클래스는 되도록 static으로 만들라 ( 멤버 클래스,어댑터 패턴 ) (0) | 2023.07.10 |
---|---|
23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 ( 클래스 계층구조 ) (0) | 2023.07.06 |
21. 인터페이스는 구현하는 쪽을 고려해 설계해라( default 메서드) (0) | 2023.07.06 |
20. 추상 클래스보다는 인터페이스를 우선하라(템플릿 메서드 패턴) (0) | 2023.07.03 |
19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 (0) | 2023.07.03 |