티스토리 뷰

728x90
반응형

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


  • 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 았는 타입 역할을 합니다. 달리 말해, 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 말해주는 것입니다. 인터페이스는 오직 이 용도로만 사용해야 합니다.

 

인터페이스의 잘못된 예


🧨 예제 코드

  • 인터페이스에는 메서드뿐만 아니라 상수도 작성할 수 있기 때문에 메서드 없이 상수만 선언하는 상수 인터페이스를 만들 수 있습니다.
public interface PhysicalConstants {
    
    static final double AVOGADROS_NUMBER = 6.022_140_857e23;
    static final double BOLTZMAN_CONSTANT = 1.380_648_52e-23;
    static final double ELECTRON_MASS = 9.109_383_56e-31;
}

 

 

💡 좋지 않은 이유

  • 클래스 내부에서 사용하는 상수는 내부 구현에 해당됩니다.
  • 상수 인터페이스를 구현하는 것은 내부 구현을 외부로 노출하는 행위입니다.
  • 클래스가 어떤 상수 인터페이스를 사용하든 사용자에게는 아무런 의미가 없습니다. 오히려 혼란만 줍니다.
  • 버전이 바뀌어 상수들을 사용하지 않게 되더라도 바이너리 호환성을 위해 여전히 상수 인터페이스를 구현하고 있어야 합니다.

💡 바이너리 호환성이란?

 

💡 더 나은 방법

  • 상수를 공개할 목적으로 인터페이스를 사용한다면 더 좋은 방법이 있습니다.
  • Enum을 사용해서 나타내기 적합하다면 Enum으로 대체합니다.
  • 유틸리티 클래스를 만들어 대체합니다.
// Enum을 사용하기
public enum PhysicalConstantsEnum {

    AVOGADROS_NUMBER(6.022_140_857e23),
    BOLTZMAN_CONSTANT(6.022_140_857e23),
    ELECTRON_MASS(6.022_140_857e23);
    
    @Getter
    private double val;

    PhysicalConstantsEnum(double val) {
        this.val = val;
    }
}

// 유틸리티 클래스 사용하기
public class PhysicalConstantsUtil {

    // 인스턴스화 방지
    private PhysicalConstantsUtil() {}

    public static final double AVOGADROS_NUMBER = 6.022_140_857e23;
    public static final double BOLTZMAN_CONSTANT = 1.380_648_52e-23;
    public static final double ELECTRON_MASS = 9.109_383_56e-31;
}

 

 

 

728x90
반응형