2013년 8월 28일 수요일

[oraclejava커뮤니티에서 강좌, 오라클자바교육,오라클교육,자바교육잘합니다]java 상수 인터페이스를 쓰지 말자!

상수 인터페이스를 쓰지 말자!



오라클자바커뮤니티에서 설립한  개발자실무교육6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)  
www.onjprogramming.co.kr



어떤 클래스가 인터페이스를 구현하면 이 클래스의 인스턴스는 이 인터페이스 타입으로 참조 할 수 있습니다.

인터페이스를 잘못 사용하는 예로 상수 인터페이스(Constant Interface)라는 것이 있는데 이 인터페이스에는 메소드가 없으며 단지 상수로 외부에 제공되는 static final  필드 들만 있습니다.

클래스 내부에서 상수를 사용 할 때 PhysicalConstants.AVOGADROS_NUMBER처럼 긴 이름대신 AVOGADROS_NUMBER와 같은 짧은 이름을 쓰려고 인터페이스에 상수를 정의하고 이 상수를 사용하는 클래스가 이 인터페이스를 구현합니다.

//상수 인터페이스 패턴  사용 하지 마세요~
public interface PhysicalConstants {
        //아보가드로 수(1/mol)
        static final double AVOGADROS_NUMBER = 6.02214199e23;

//볼쯔만 상수
        static final double BOLTZMANN_ConSTANT = 1.3806503e-23;
       
}

상수 인터페이스 패턴은 인터페이스를 잘못 사용하고 있는 것입니다. 클래스 내부에서 사용하는 상수는 자세한 구현 방식에 해당하는 것으로 상수 인터페이스를 쓰는 것은 이런 자세한 구현 방식을 외부에 제공하는 API에 그대로 드러나게 됩니다.

API 사용자에게는 클래스가 상수 인터페이스를 implements 하든 말든 문제가 아닙니다. 더욱 좋지 않은 것은 이후의 배포 판에서 더 이상 상수가 필요 없더라도 바이너리 차원의 호환성을 유지하기 위해 상수 인터페이스를 계속 implements 할 수 밖에 없습니다.

상수를 외부에 제공하고 싶다면 더 좋은 방법이 많이 있습니다. 만약 상수가 기존 클래스나 인터페이스와 밀접한 관계가 있다면 바로 이 인터페이스나 클래스에 상수를 추가 합니다. 예를 들어 자바 플랫폼의 기본 타입 래퍼 클래스는 (Integer, Float) MIN_VALUE, MAX_VALUE라는 상수를 따로 정의하여 외부에 제공 합니다.

만약 상수가 열거 타입의 하나라면 타입 안전 열거 클래스(Typesafe enum class)를 사용하며 인스턴스를 만들지 못하는 유틸리티 클래스를 사용 할 수도 있습니다. 아래는 이전의 PhysicalConstants 클래스를 바꾼 것 입니다.

public class PhysicalConstants {

        private PhysicalConstants() {} //인스턴스를 못 만들게 합니다.
       
        //아보가드로 수(1/mol)
        public static final double AVOGADROS_NUMBER = 6.02214199e23;

//볼쯔만 상수
        public tatic final double BOLTZMANN_ConSTANT = 1.3806503e-23;
}

PhysicalConstants를 유틸리티 클래스로 바꾸면 클라이언트는 상수가 필요 할 때마다 PhysicalConstants. AVOGADROS_NUMBER와 같이 긴 이름을 사용해야 하지만 좋은 API를 제공하는 것을 생각하면 이 정도는 무시할 만 합니다. 또, 다른 클래스의 static 필드를 가져다 쓰면 다음과 같은 짧은 이름으로 private static 필드나 지역 변수로 상수를 선언하면 불필요한 타이핑을 줄일 수 있습니다.

private static final double PI = Math.PI;

결론적으로 정리하면 인터페이스는 타입을 정의 할 때 사용하는 것이 바람직하며 상수를 제공하기 위해서는 사용하지 말아야 합니다.


댓글 없음:

댓글 쓰기