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

## **인터페이스의 용도**

* 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입의 역할
* 자신의 인스턴스로 무엇을 할 수 있는지 클라이언트에 알려주는 것
* **상수 공개용 수단으로 사용하지 말 것. 즉, 상수 인터페이스는 사용하지 말자!**

## **상수 인터페이스**

* 메서드 없이 static final 필드만 존재하는 인터페이스
* 정규화된 이름(qualified name) 사용하는 것을 피하기 위해 사용
* 상수 인터페이스 구현 시, 클래스 내부에서 사용하는 상수는 내부 구현이므로 이를 클래스의 API로 노출된다.
* 클래스가 어떤 상수 인터페이스를 사용하든 사용자에게는 의미가 없고, 오히려 혼란을 주기도 하며, 상수들에 종속되는 클라이언트 코드를 작성할 수도 있다.
* 클라이언트 코드에서 더이상 상수들을 사용하지 않아도 바이너리 호환성을 위해 상수 인터페이스를 유지하고 있어야 한다.

## **상수를 공개하는 방법**

* 특정 클래스나 인터페이스와 강하게 연관된 경우 클래스나 인터페이스 내부에 추가 ex) Integer, Double 의 MIN\_VALUE, MAX\_VALUE 상수
* enum 타입 사용
* 인스턴스화할 수 없는 유틸리티 클래스 사용

```java
public class PhysicalConstants {
    private PhysicalConstants() { } // 인스턴스화 방지
    // 아보가드로 수 (1/몰)
    public static final double AVOGADROS_NUMBER = 6.022_140_857e23;
    // 볼츠만 상수 (J/K)
    public static final double BOLTZMANN_CONST  = 1.380_648_52e-23;
    // 전자 질량 (kg)
    public static final double ELECTRON_MASS    = 9.109_383_56e-31;
}
```

> 고정/부동 소수점이 5자리 이상이라면 '\_'를 사용해 리터럴 값에 영향을 주지 않으면서 가독성이 좋게 표현할 수 있다.

* 유틸리티 클래스의 상수를 사용할 때 클래스 이름까지 명시하거나, 정적 임포트를 통해 클래스 이름 생략 가능
