Skip to content

Latest commit

 

History

History
89 lines (62 loc) · 3.84 KB

34. int 상수 대신 열거 타입을 사용하라.md

File metadata and controls

89 lines (62 loc) · 3.84 KB

int 상수 대신 열거 타입을 사용하라

  • 열거 타입이란 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입이다.

  • 열거 타입 지원 이전에는 정수 열거 패턴 기법을 사용했다.

    public static fianl int APPLE_FUJI         = 0;
    public static fianl int APPLE_PIPPIN       = 1;
    public static final int APPLE_GRANNY_SMITH = 2;
    • 정수 열거 패턴 기법은 타입 안전을 보장할 방법이 없으며 표현력이 좋지 않다.
  • 열거 타입(enum type)은 열거 패턴의 단점을 해소하는 동시에 여러 장점을 가진다.


열거 타입(enum type)

// 가장 단순한 열거 타입
public enum Apple { FUJI, PIPPIN, GRANNY_SMITH }
public enum Orange { NAVEL, TEMPLE, BLOOD }
  • 자바의 열거 타입은 완전한 형태의 클래스이기 때문에, 다른 언어의 열거 타입보다 훨씬 강력하다.

  • 열거 타입 자체는 클래스이며, 상수 하나당 자신의 인스턴스를 하나씩 만들어 public static final 필드로 공개한다.

    • 열거 타입은 밖에서 접근할 수 있는 생성자를 제공하지 않으므로 사실상 final이다.
    • final이기 때문에 클라이언트가 인스턴스를 직접 생성하거나 확장할 수 없고, 열거 타입으로 만들어진 인스턴스는 딱 하나씩만 존재한다.
  • 열거 타입은 컴파일타임 타입 안정성을 제공한다.

    • 열거 타입을 매개변수로 받는 메서드를 선언했다면, 건네받은 참조는 null이 아닌, Enum type 값 중 하나이다.
    • 열거 타입에는 각자의 이름 공간이 있기 때문에, 이름이 같은 상수도 공존할 수 있다.
    • 열거 타입에 새로운 상수를 추가하거나 순서를 바꿔도 컴파일하지 않아도 된다.
      • 공개되는 것이 필드의 이름 뿐이기 때문에, 상수 값이 클라이언트로 컴파일되어 각인되지 않는다.
  • 열거 타입은 임의의 메서드나 필드를 추가할 수 있고, 임의의 인터페이스를 구현할 수도 있다.

  • e.g. 태양계를 열거 타입으로 나타낸 코드

    public enum Planet {
        MERCURY(3.302e+32, 2.439e6),
        VENUS  (4.869e+24, 6.052e6),
        ERATH  (5.975e+24, 6.378e6),
        MARS   (6.419e+23, 3.393e6),
        JUPITER(1.899e+27, 7.149e7),
        SATURN (5.685e+26, 6.027e7),
        URANUS (8.683e+25, 2.556e7),
        NEPTUNE(1.024e+26, 2.477e7);
        
        private final double mass;
        private final double radius;
        private final dobule surfaceGravity;
        
        private static final double G = 6.67300E-11;
        
        Planet(double mass, double radius) {
            this.mass = mass;
            this.radius = radius;
            surfaceGravity = G * mass / (radius * radius);
        }
        
    	public double mass() { return mass; }
        public double radius() { return radius; }
        public double surfaceGravity() { return surfaceGravity };
        
        public double surfaceWeight(double mass) {
            return mass * surfaceGravity;
        }
    }
  • 열거 타입 상수 각각을 특정 데이터와 연결지으려면, 생성자에서 데이터를 받아 인스턴스 필드에 저장하면 된다.

  • 열거 타입은 자신 안에 정의된 상수들의 값을 배열에 담아 반환하는 정적 메서드 values가 있기 때문에 toString 메서드를 사용하면 적합한 문자열을 출력한다.

    • toString을 재정의하여 원하는 대로 출력할 수도 있다.
  • 상수별 메서드 구현

    • switch 문으로 값에 따라 분기하는 열거타입은 좋지 않다.
    • 열거 타입 별로 다른 동작을 해야 된다면 상수별 메서드를 구현하자.
  • 열거 타입 상수 일부가 같은 동작을 공유한다면 전략 열거 타입 패턴을 사용하자!