1 답변
-
클래스에서 인터페이스를 구현할때 구현 되는 인터페이스는 그 클래스의 인스턴스를 참조하는데 사용되는 일종의 타입같은 역할을 합니다. 그러므로 클래스가 구현하는 인터페이스는 클라이언트가 그 클래스의 인스턴스로 할 수 있는 일을 나타내야합니다. 이외의 다른 목적으로 인터페이스를 사용하는건 적합하지 않습니다. 예를들자면 상수 인터페이스 같은 것 입니다. 그런 인터페이스는 메소드를 갖지 않고 외부에 제공하는 상수값을 갖는 static final 필드만으로 구성되는데요. 그런 상수를 사용하는 클래스에서는 상수 필드명 앞에 클래스의 이름을 붙이지 않고 상수를 사용하기 위해 그 인터페이스를 구현합니다.
public interface PhysicalConstants{ //아보가드로 수 static final double AVOGARDROS_NUMBER = 6.02214199e23; //볼쯔만 상수 static final double BOLTZMANN_CONSTANT= 1.3806503e-23; //전자 질량 static final double ELECTRON_MASS = 9.10938188e-31; }
상수 인터페이스 패턴은 인터페이스를 형편없이 사용합니다. 클래스가 내부적으로 사용하는 상수들은 그 클래스의 상세한 구현에 속하지만 상수 인터페이스를 구현하면 그런 상세한 구현이 그 클래스의 외부api로 노출되게 됩니다. 그 클래스가 상수 인터페이스를 구현한다는 것이 클래스 사용자에게는 중요하지 않습니다. 하지만 그들을 혼란스럽게 할수있습니다. 그리고 더 나쁜것은, 그런 구현이 앞으로의 약속 이행을 나타낸다는 것이죠. 무슨 말이냐면 향후 배포판에서 그 상수를 더 이상 사용할 필요가 없어서 클래스를 변경하더라도 바이너리 호환성을 유지하기 위해 여전히 그 상수 인터페이스를 구현해야합니다. 만일 final이 아닌 클래스가 상수 인터페이스를 구현한다면, 그 클래스의 모든 서브 클래스들이 갖는 네임 스페이스가 줄어들것입니다. (상수 인터페이스에 있는 상수 필드명과 같은 이름은 사용할수없으므로)
그렇다면 상수를 외부에 제공하고싶을때는 어떻게하냐면 상수 유틸리티 클래스를 만드는것이 좋다.
package com.effectivejava.science; public class PhysicalConstants{ private PhysicalConstants(){}//인스턴스 생성 방지 public static final double AVOGARDROS_NUMBER = 6.02214199e23; public static final double BOLTZMANN_CONSTANT= 1.3806503e-23; public static final double ELECTRON_MASS = 9.10938188e-31; }
이런식으로 만들어주는게 더 낫습니다.
댓글 입력