본문으로 바로가기

1. 인터페이스의 용도

인터페이스란 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할이다. 클래스가 어떤 인터페이스를 구현하는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 얘기해주는 것이다

 

2. 안티 패턴 : 상수 인터페이스

PhysicalConstants.java

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() {} // 인스턴스화 방지
    
    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;
}

// 숫자 리터널에 사용한 밑줄(_)
// 자바 7부터 ㄹ허용되는 이 밑줄은 숫자 리터럴의 값에는 아무런 영향을 주지 않으면서 읽기 편하게 해준다. 
// 십진수 리터럴도 (정수,부동수수점) 세 자리씩 묶어주는 것이 좋다.

 

인터페이스는 타입을 정의하는 용도로만 사용해야 한다. 상수 공개용 수단으로 사용하지 말자.