peaches-book-study / effective-java

이펙티브 자바 3/E
0 stars 2 forks source link

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

Open heon118 opened 3 months ago

heon118 commented 3 months ago

Chapter : 6. 열거 타입과 애너테이션

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

Assignee : heon118


🍑 서론

열거 타입

일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입(ex. 사계절, 태양계의 행성, 카드게임의 카드 종류 등)
    // 열거 타입 이전의 정수 열거 패턴(int enum pattern)
    public static final int APPLE_FUJI          = 0;
    public static final int APPLE_PIPPIN        = 1;
    public static final int APPLE_GRANNY_SMITH  = 2;

    public static final int ORNGE_NAVEL         = 0;
    public static final int ORNGE_TEMPLE        = 1;
    public static final int ORNGE_BLOOD         = 2;

정수 열거 패턴의 단점

🍑 본론

java의 열거타입 enum

    // 가장 단순한 열거 타입
    public enum Apple {FUJI, PIPPIN, GRANNY_SMITH}
    public enum Orange {NAVEL, TEMPLE, BLOOD}

열거 타입

데이터와 메서드를 갖는 열거 타입

    public enum Planet {
        MERCURY(3.302e+23, 2.439e6),
        VENUS(4.869e+24, 6.052e6),
        EARTH(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 double surfaceGravity;    // 표면중력(단위: m/ 5^2)

        // 중력상수(단위: m^3/ kg 5^2)
        private static final double G = 6.67300 - 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 getSurfaceGravity() { return surfaceGravity; }

        public double surfaceWeight(double mass) {
            return mass * surfaceGravity;   // F = ma
        }
    }
    /**
     * MERCURY에서의 무게는 69.912739이다. 
     * VENUS에서의 무게는 167.434436이다. 
     * EARTH에서의 무게는 185.000000이다. 
     * MARS에서의 무게는 70.226739이다. 
     * JUPITER에서의 무게는 467.990696이다. 
     * SATURN에서의 무게는 197.120111이다. 
     * URANUS에서의 무게는 167.398264이다. 
     * NEPTUNE에서의 무게는 210.208751이다. 
     */
fromString : toString이 반환하는 문자열을 열거 타입 상수로 변환해주기
    private static final Map<String, Operation> stringToEnum =
            Stream.of(values()).collect(
                    toMap(Object::toString, e -> e));
    // 지정한 문자열에 해당하는 Operation을 반환한다.
    public static Optional<Operation> fromString(String symbol) {
        return Optional.ofNullable(stringToEnum.get(symbol));
    }
- switch 문은 열거 타입의 상수별 동작을 구현하는데 적합하지 않다.
- 하지만 기존 열거 타입에 상수별 동작을 혼합해 넣는 경우 switch문이 좋은 선택이 될 수 있다.
```java
    public static Operation inverse(Operation op){
        switch (op){
            case PLUS:      return Operation.MINUS;
            case MINUS:     return Operation.PLUS;
            case TIMES:     return Operation.DIVIDE;
            case DIVIDE:    return Operation.TIMES;
            default: throw new AssertionError("알 수 없는 연산 : " + op);
        }
    }

Referenced by

-

youngkimi commented 3 months ago

image 수정해주떼염