티스토리 뷰
enum 은 열거형으로, 클래스와같이 선언하여 내부에 필요한 요소들을 상수처럼 열거해놓고 사용한다.
enum의 사용방법은
enum EnumTest {
A, B, C, D;
}
와 같이 선언하여
EnumTest et = EnumTest.A; 와 같이 열거된 A형의 객체를 생성할수도있다.
그리고 주 클래스의 외부에 선언된것이 아니라면 static 과 같이 적용되어
EnumTest.A 또는 EnumTest.B 와 같이 상수로 사용할수도 있다.
그리고 enum은 클래스와 마찬가지로 생성자를 만들어 사용할수도 있으며 맴버 메소드및 맴버 변수를 사용할수도 있다. 기본적으로 생성자를 만들지 않을경우 default 생성자가 자동으로 생성된다.(클래스와 같다.)
생성자는
enum EnumTest {
A(10,20), B(20,30);
private int a,b;
EnumTest(int a, int b) {
this.a = a;
this.b = b;
}
}
와 같이 선언한후
EnumTest et = EnumTest.A;
와 같이 선언하면 생성자에 10 과 20이 들어가게 된다. B의 경우는 20과 30이들어가게 된다.
그리고 enum에 열거된 A와 B는 그것 자체가 하나의 객체이므로 Object 클래스를 상속받게 된다.
System.out.println(et) 라고 할경우는 A가 할당되어있으므로 출력값도 A이다. 즉 A형객체이다.
Object oe = new EnumTest.A 와 같은격이다.
하지만 et 와 oe는 엄연히 다르다.
et 는 Object를 상속 받는 EnumTest 형이고 oe 는 단순히 Object형이다.
그러므로 oe는 EnumTest 내부에 선언된 맴버 들에게 직접 접근하지 못한다.
다시 본론으로 들어가서 et는 Object 를 상속하므로 Object 에 정의된 toString 을 오버라이딩할수있다.
System.out.println(et);
는 A 라는 출력 결과가 나오지만
열거된 A가 A{public String toString() { return "A이다.";}} 라고 선언되어있을경우
System.out.println(et); 의 결과는 A이다 가 출력이 된다.
다시말해 Object 를 상속하므로 Object의 메소드를 오버라이딩이 가능하다.
생성자와 열거의 내부에 메소드를 선언하는 방법은
A(10,20){public String toString() {return "A이다";}} 와 같이 하면된다.
이외에 내부에 변수나 다른 메소드를 선언할수는 있으나 직접적으로 접근하지는 못한다.
이는 무명내부클래스처럼 어떠한 클래스의 메소드에 대한 오버라이딩만이 가능하다.
여기서 는 Object 에 한해서만 가능하다.
다른 메소드를 정의해서 사용하고 자 한다면 메소드 오버라이딩의 특징을 이용하면 된다.
A(10,20){
int varA = 10;
void methodA() {
System.out.println(varA);
}
public String toString() {
methodA();
return "A이다";
}
}
와 같이 선언하면
EnumTest.A.toString();
을 실행하게 되면 열거 내부에 선언된 varA변수와 methodA 메소드도 실행이 가능하다.
이에대한 참고내용은 메소드 오버라이딩에 대한 재정의 부분을 참고하기 바란다.
enum 에는 values 라는 메소드를 제공한다.
values 는 열거된 값들을 모두 String 형의 배열로 반환한다.
valueOf(String str) 라는 메소드도 제공하는데 이것은
주어진 문자열과 같은 이름으로 열거된 것을 실행하게된다.
즉 valueOf("A") 라고 줄경우 EnumTest.A를 한것과 마찬가지다.
values 와 valueOf는 모두 static 메소드 이다.