반응형

ITEM 22 "인터페이스는 타입을 정의하는 용도로만 사용하라"

 

상수들을 다른 클래스에서 사용하고자 할 때 자바가 아니였다면 전역적으로 사용하는 상수들을 한 파일에 모아두고 그 상수를 참조해서 쓰면 되는데, 자바에서는 어느 임의의 스코프에 상수들을 따로 모아 관리해야 된다고 생각할 수 있다.

 

가장 간단하게 정리할 수 있을 것 같아 보이는 영역이 인터페이스이다.

 

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;
}

 

하지만 이런 상수 인터페이스는 인터페이스를 잘못 사용한 예이다. 상수 인터페이스란 메서드 없이, 상수를 뜻하는 static final 필드로만 기재되어 있는 인터페이스를 말한다. 인터페이스는 추상 클래스와 성격이 비슷하다. 가장 상위에 있는 참조 지역인 이 공간에 상수를 둔다면, 이전 아이템에서 살펴보았듯이 캡슐화가 깨지게 된다. 더 이상 그 상수들을 쓰지 않게 되더라도 호환성을 위해 해당 인터페이스를 구현하고 있어야 하며, 참조가 가능해져 하위 클래스들이 같이 오염된다.

 

상수를 공개할 목적이라면, 차라리 그 클래스나 인터페이스 자체에 직접 추가하는 것이 올바르다. 아니면, 인스턴스화 할 수 없는 유틸리티 클래스에 담아 공개하는 것이 좋다.

 

public class EffectiveJavaTest {
    // 인스턴스화 방지
    private EffectiveJavaTest() {}
    public static final double CUSTOM_PERIMETER = 3.141592;
    public static final double ELECTRON_MASS = 9.109_383_56e-31;
    public static final double BOLTZMANN_CONST = 1.380_648_52e-23;
}

 

인터페이스는 자신을 구현할 클래스의 인스턴스를 참조할 수 있는 타입 역할만 해야 한다.

클래스 입장에서는 자신의 인스턴스로 무엇을 할 수 있을지 클라이언트에게 알려주는 용도. 딱 그 정도이어야 한다.

클래스 내부에서 사용하는 상수 변수를 인터페이스로 올려서 뺀다면 내부 구현을 노출하는 행위와 같다는 사실을 명심하자.

반응형

+ Recent posts