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