티스토리 뷰
형이 안전한(Typesafe) enum - 이것은 말 많고 에러 나기 쉬운 점들이 없이 Typesafe Enum 의 잘 잘려진 장점들을 제공해 준다.
주의 : enum 은 Java 5에새 새로 생긴 키워드이므로, 옛날 자바 코드에서 enum을 형의 이름(변수/클래스/메소드 이름 등)으로 사용했다면, -source 1.5 를 사용하기 위해 그것들을 모두 수정해야 한다.
시 인용:
상수 선언이 동전을 대표하는 숫자를 넘겨주면서 어떻게 생성자를 호출하는지 보라. 그리고 어떻게 private 필드에 public 접근자로 값을 저장하는지 보라. 색깔을 위한 또 다른 enum을 어떻게 생성했는지 보라. enum 상수를 어떻게 switch 구문에 사용하는지 보라. 이것은 당신이 enum 클래스에 "메소드를 추가"하고자 할 때 매우 유용하다. 하지만 어떤 이유로든 클래스를 수정할 수는 없다.
사실 새로운 enum은 다른 언어의 구조체(struct)에 불과하다. enum에 메소드와 필드를 추가하지 않는다면 그것은 형이 안전한 enum 상수와 같다. 만약 메소드와 필드를 추가하면, 완전한 객체가 된다.
* 추가
- Java 5의 enum 형에는 메소드와 필드를 추가할 수 있다. 다른 언어의 enum 형과 다른 점이다.
- 각 enum 타입은 static values() 메소드를 가지고 있다. 이 메소드는 enum의 모든 값을 배열로 리턴한다.
- 원문에서는 Coin.VALUES로 Coin의 상수 값들을 가져왔지만, 실제론 작동하지 않는다. values() 메소드를 사용해야 한다.
- 원문에서는 switch의 case 문에서 Coin.penny 와 같은 식으로 값을 지정했지만 실제로는 penny 로만 지정하게 바뀌었다. switch/case에서 case 문에 사용되는 enum 형에만 해당된다. 리턴값인 CoinColor.copper는 그대로이다.
주의 : enum 은 Java 5에새 새로 생긴 키워드이므로, 옛날 자바 코드에서 enum을 형의 이름(변수/클래스/메소드 이름 등)으로 사용했다면, -source 1.5 를 사용하기 위해 그것들을 모두 수정해야 한다.
시 인용:
정수 enum 은 곧 사라지리
너무 오랫동안 우리를 괴롭혔던 적과 함께.
형이 안전한 enum의 강력한 힘은
우리의 적을 무력화 시키네.
* Coin.java --------------------
public enum Coin {
penny(1), nickel(5), dime(10), quarter(25);
Coin(int value) { this.value = value; }
private final int value;
public int value() { return value; }
}
* CoinTest.java --------------------
public class CoinTest {
public static void main(String[] args) {
for (Coin c : Coin.values()) // 바뀐 부분
System.out.println(c + ": "
+ c.value() +"? " + color(c));
}
private enum CoinColor { copper, nickel, silver }
private static CoinColor color(Coin c) {
switch(c) {
case penny: return CoinColor.copper;
case nickel: return CoinColor.nickel;
case dime:
case quarter: return CoinColor.silver;
default: throw new AssertionError("Unknown coin: " + c);
}
}
}
상수 선언이 동전을 대표하는 숫자를 넘겨주면서 어떻게 생성자를 호출하는지 보라. 그리고 어떻게 private 필드에 public 접근자로 값을 저장하는지 보라. 색깔을 위한 또 다른 enum을 어떻게 생성했는지 보라. enum 상수를 어떻게 switch 구문에 사용하는지 보라. 이것은 당신이 enum 클래스에 "메소드를 추가"하고자 할 때 매우 유용하다. 하지만 어떤 이유로든 클래스를 수정할 수는 없다.
사실 새로운 enum은 다른 언어의 구조체(struct)에 불과하다. enum에 메소드와 필드를 추가하지 않는다면 그것은 형이 안전한 enum 상수와 같다. 만약 메소드와 필드를 추가하면, 완전한 객체가 된다.
* 추가
- Java 5의 enum 형에는 메소드와 필드를 추가할 수 있다. 다른 언어의 enum 형과 다른 점이다.
- 각 enum 타입은 static values() 메소드를 가지고 있다. 이 메소드는 enum의 모든 값을 배열로 리턴한다.
- 원문에서는 Coin.VALUES로 Coin의 상수 값들을 가져왔지만, 실제론 작동하지 않는다. values() 메소드를 사용해야 한다.
- 원문에서는 switch의 case 문에서 Coin.penny 와 같은 식으로 값을 지정했지만 실제로는 penny 로만 지정하게 바뀌었다. switch/case에서 case 문에 사용되는 enum 형에만 해당된다. 리턴값인 CoinColor.copper는 그대로이다.
댓글