내가 개인적으로 이넘을 좋아합니다. 

이넘은 C/C++에서 쓰는 열거형과는 차원이 다르다.(C++은 모르겠는데 C랑은 일단...)
쉽게 생각하면 그냥 하나의 class라고 보면된다. 실제로 enum을 거의 동일한 class로 변환 시킬수도 있다.(class를 enum으로 바꾸는건 좀 생각해볼 문제긴 하지만)
메소드도 집어넣을수 있고, 필드(맴버변수)도 있고 생성자도 있다! 게다가 abstract 키워드도 넣을수 있다는??

참 특이한 녀석인데. 이넘은 일단 어떤 상태나 특성(Type)을 저장할떄 사용할수있다. 이런 동작을 하는것은 static final int 도 할수 있다. 근데 뭐랄까 static final int 의 경우는 숫자를 잘못 적을수도 있고 toString 이라던가 compare 같은 요상한 기능들을 제공하지 못한다.

게다가 아까 말했듯이 클레스이기 때문에 인터페이스를 확장할수 있다.(클레스 상속은 안된다.)
Comparator 같은 인터페이스를 상속시켜서 여러종류의 Comparator 을 정의해두고 상황에 따라 쓸수도 있다.

Comparator 같은거 상속했더니 메소드를 하나 생성하게 되면 enum을 여러개 쓸수 없다.
뭔가 개소리 같다고 생각하신다면 저랑 같네여..

코드로 보여드리겠습니다.

public class Test {
	int index;
	String name;
	int price;

	enum TestComparator implements Comparator<Test> {
		INDEX, NAME, PRICE;
		@Override
		public int compare(Test o1, Test o2) {
			// TODO Auto-generated method stub
			return 0;
		}
	}
} 

이런식으로 Comparator 을 확장한 enum을 만들었다 칩시다. 근데 객체는 INDEX,NAME,PRICE 인데 comapre는 하납니다.
음.. 내가 원하는건 상황에 따라서 index,name 혹은 price 순서대로 정렬을 하고싶어요
라는 문제가 있습니다. 
그럼 어떻게 하느냐?

public class Test {
	int index;
	String name;
	int price;

	enum TestComparator implements Comparator<Test> {
		INDEX, NAME, PRICE;
		@Override
		public int compare(Test o1, Test o2) {
			switch (this) {
				case INDEX:

					break;
				case NAME:

					break;
				case PRICE:

					break;
				default:
					break;
			}
			return 0;
		}
	}
} 
switch-case 문을 이용해서 this를 넣어주면 위와 같은 방법으로 사용할수 있습니다.
근데 참.. 맘에 안드는 코드죠. 일단 저상황에서 INDEX_NAME 같은 걸 하나 추가했다고 합시다. case 문을 하나더 추가해야겠네요.
만들다보니 enum에 상수를 추가한뒤에 compare를 깜박하고 구현 안할수도 있습니다. 근데 나중에 보면 정렬도 안되고 이뭐병...

이런식으로 enum에서 특성 상수에 따라서 다른 동작을 하게 하는데에는 switch-case가 별로 좋지 않은 구조입니다.
그렇다면 어떻게 하느냐?

기억하실지 모르겠으나 enum에 abstract 키워드를 쓸수 있다고 위에서 말했습니다.
바로 compare 메소드를 추상화 시켜버리는겁니다.
public abstract int compare(Test o1, Test o2); 라고 말이죠
그러면 abstract 메소드는 언제 구현하느냐? 상수를 선언할때 익명 클레스로 만들어버리느겁니다. (근데 이름이 있잔아??)

public class Test {
	int index;
	String name;
	int price;

	enum TestComparator implements Comparator<Test> {
		INDEX {
			@Override
			public int compare(Test o1, Test o2) {
				// TODO Auto-generated method stub
				return 0;
			}
		},
		NAME {
			@Override
			public int compare(Test o1, Test o2) {
				// TODO Auto-generated method stub
				return 0;
			}
		},
		PRICE {
			@Override
			public int compare(Test o1, Test o2) {
				// TODO Auto-generated method stub
				return 0;
			}
		};
		@Override
		public abstract int compare(Test o1, Test o2);
	}
} 

이렇게 익명클레스처럼 작성해줄수 있습니다. 

enum의 switch-case 문이 나쁘다는 것이 아니라 enum 자체를 작성할때는 switch-case보다는 추상메소드를 이용하는것이 더 안전하게 프로그램을 작성할수 있다.

외부에서 enum의 종류에 따라서 다른 동작을 할때는 switch-case문이 매우 유용하다는것을 알아두자. 
Posted by 동적할당
: