인터페이스는 해당 클래스의 객체를 참조 할 수 있는 자료형(type)의 역할을 합니다.
인터페이스를 구현하면 int, string 등의 자료형을 그대로 오버라이드 하게되는데
이 목적을 위해 언터페이스를 사용하죠.
하지만 개중에는 그렇지 않은 인터페이스도 있습니다.
public Interface PhysicalConstants {
// 아보가르도 수(1/mol)
static final double AVOGADROS_NUMBER = 6.02214199e23;
// 볼쯔만 상수(J/K)
static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
// 전자 질량(kg)
static final double ELECTRON_MASS = 9.10938188e-31;
}
이는 상수 인터페이스 패턴입니다.
보통 편의성 때문에 사용하게 됩니다.
이런식의 인터페이스 사용은
public class Main {
public static void main(String[] args) {
System.out.println(PhysicalConstants.AVOGADROS_NUMBER);
}
}
이렇게 사용해야 할 코드를
public class Main implements PhysicalConstants {
public static void main(String[] args) {
System.out.println(AVOGADROS_NUMBER);
}
}
이렇게 사용하게 해주거든요
하지만 이런 방식의 사용은 클래스의 세부사항이 공개되게 됩니다. 캡슐화 원칙 훼손이죠.
그리고 인터페이스는 자료형의 구현이라는 하나의 약속입니다.
이 사항을 모르는 일반 사용자들은 자료형의 구현으로 파악할텐데 혼란을 줄 가능성도 큽니다.
그리고 Main 클래스를 상속하는 모든 하위 클래스가 저 구현형태에 영향을 받게됩니다.
다 같이 사이좋게 오염! 되는거죠.
때문에 삼갈 필요가 있습니다.
저런 형식의 상수정의를 사용하고 싶다면
자바 1.5부터는 더 좋은 방법이 있습니다.
public class PhysicalConstants {
private PhysicalConstants() {}
static final double AVOGADROS_NUMBER = 6.02214199e23;
static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
static final double ELECTRON_MASS = 9.10938188e-31;
}
이런 식의 상수 클래스를 정의한 후
사용할 클래스에 이런 식으로 정적 임포트를 해주면 됩니다.
import static com.effectivejava.science.PhysicalConstants;
이렇게 한다면 인터페이스를 사용하지 않고도
사용하던 방식 그대로 상수 사용이 가능해집니다.
이 규칙의 요는 인터페이스를 자료형 구현 이외의 용도로 사용하지 말라는 것이지요.
'프로그래밍 > Java' 카테고리의 다른 글
이펙티브 자바 규칙 20 - 태그가 달린 클래스 대신 클래스 계층을 활용하라 (0) | 2018.02.20 |
---|---|
이펙티브 자바 규칙 18 - 추상 클래스 대신 인터페이스를 사용하자 (0) | 2018.02.17 |
이펙티브 자바 규칙 17 - 계승을 위한 문서를 갖추거나, 그럴 수 없다면 금지하자 (0) | 2018.02.15 |