더북(TheBook)

예제 2

창을 닫는 연산을 제어하는 데 사용하는 네 가지 상수를 정의한 javax.swing.WindowConstants 인터페이스가 있다. 코드는 다음과 같다(공간을 절약하려고 문서 주석은 편집했다).

 


public interface WindowConstants {
  /** 창 닫기 연산에서 아무것도 하지 않는 기본 값 */
  public static final int DO_NOTHING_ON_CLOSE = 0;
  /** 창 닫기 연산에서 창을 숨기는 기본 값 */
  public static final int HIDE_ON_CLOSE = 1;
  /** 창 닫기 연산에서 창을 사라지게 하는 기본 값 */
  public static final int DISPOSE_ON_CLOSE = 2;
  /** 창 닫기 연산에서 애플리케이션 종료 기본 값 */
  public static final int EXIT_ON_CLOSE = 3;
}

 

이 인터페이스는 ‘상수 인터페이스’의 예로, 언어가 제공하는 인터페이스 기능을 잘못 활용했다. 개발자나 설계자는 왜 인터페이스를 사용하여 상수를 담았을까? 첫 번째 이유는 자바 1.5부터 열거형을 도입했기 때문에 개발자는 기존 기능을 사용해야 했다. 두 번째 이유는 인터페이스에 정의된 상수를 사용하려면 클래스가 위임 대신 상속을 사용하는 방식이 더 편리했기 때문이다. 해당 인터페이스를 구현한 클래스는 인터페이스 이름으로 상수 값을 명시적으로 한정할 필요 없이 편리하게 인터페이스에 정의된 상수에 접근할 수 있었다! 여기서 질문을 자연스럽게 던질 수 있다. 왜 클래스를 사용하는 대신 인터페이스를 사용하여 상수를 담았을까? 상수를 정의하려고 클래스를 사용했다면, 상속받은 클래스는 다른 어떤 클래스도 확장할 수 없다(자바는 다중 클래스 상속을 지원하지 않는다는 사실에 주목하자). 따라서 상수를 담는 데 클래스보다는 인터페이스를 더 선호했다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.