2018-4-6 TIL Lotto에서 배운 Enum의 특징

Enum의 특징

  • Enum은 클래스와 특성이 똑같다.
  • Enum은 인스턴스가 1개만 생성이 가능하다.
public class Ab {
    void a(Direction d) {
        if (d.equals(Direction.EAST)) {

        }

        if (d == Direction.EAST) {

        }
    }
}
  • Enum은 인스턴스가 1개이기때문에 ==으로 값을 비교를 해도 된다.
  • 인스턴스가 1개라는것은 주소값이 1개라는 의미이다.
public enum Rank {
    FIRST(6, 1000000000),
    SECOND(5, 300000000),
    THIRD(5, 1500000),
    FOURTH(4, 50000),
    FIFTH(3, 5000);

    private int matchCount;
    private int winnerPrize;

    private Rank(int matchCount, int winnerPrize) {
        this.matchCount = matchCount;
        this.winnerPrize = winnerPrize;
    }

    public boolean isFirst() {
        // 하나이기때문에 this가 가능하다.
        return FIRST == this;
    }

    public int getTotalWinnerPrize(int count) {
        return this.winnerPrize * count;
    }

    public static Rank valueOf(int matchCount) {
        Rank[] ranks = values();
        for (Rank rank : ranks) {
            if (rank.matchCount == matchCount)
                return rank;
        }
        throw new IllegalArgumentException();
    }
}
  • FIRST(6)라는 것이 새로운 인스턴스를 생성을 하는 것이다.
  • 인스턴스이기때문에 this사용이 가능하다.
  • Enum을 바라볼때는 객체의 인스턴스의 관점으로 바라보면 된다.
  • Enum에서는 상태값이 바뀌는 값을 관리하면 안된다. 고정된 값들만 관리를 해야한다. 왜냐하면 인스턴스가 1개이기때문이다. 나중에 웹 프로그래밍 멀티쓰레드에서 문제가 된다.
  • 오로지 고정된 값만 관리 fianl을 통해서 고정을 할 수도 있다.
private final int matchCount;
private final int winnerPrize;

private Rank(final int matchCount,final int winnerPrize) {
	this.matchCount = matchCount;
	this.winnerPrize = winnerPrize;
}
  • 인스턴스메소드를 클래스메소드로 만들기 위해서는 인자를 넘겨주어야한다.
  • 테스트관점에서는 static메소드를 만들면 input, output이 명확하기때문에 static메소드가 더 편하다.
  • 인스턴스변수가 많아지면 인스턴스가 복잡해진다. 최소화를 하자.
  • 인스턴스생성은 비용이라고 생각을 하면 된다. ArrayList<>()를 생성을 하면 생각보다 무겁다.
Written on April 6, 2018