인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 하는 용도로만 사용해야한다.
- 즉 클래스가 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지 클라이언트한테 이야기해주는 용도
public interface PhysicalConstants {
static final double AVOGADROS_NUMBER = 6.022_140_857e23;
static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
static final double ELECTRON_MASS = 9.109_383_56e-31;
}
- 상수 인터페이스를 구현하는건 내부 구현을 클래스의 api로 노출하는 행위다.
- 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아닌 내부 구현에 해당함
- 클라이언트 코드가 내부 구현에 해당하는 이 상수들에 종속되게 한다.
- final이 아닌 클래스가 상수 인터페이스를 구현하면 모든 하위 클래스의 이름공간이 그 인터페이스가 정의한 상수들로 오염된다.
public class PhysicalConstants {
private PhysicalConstants() { } // 인스턴스화 방지
public static final double AVOGADROS_NUMBER = 6.022_140_857e23;
public static final double BOLTZMANN_CONST = 1.380_648_52e-23;
public static final double ELECTRON_MASS = 9.109_383_56e-31;
}
- fully qualified name?
- 클래스가 속한 패키지 명을 모두 포함한 이름을 뜻한다.
- 예를 들어 String을 구현하는 방법에는
String s = new String()
과java.lang.String s = new java.lang.String()이 있다.
- 후자가 qualified name, 전자가 alias name