자바의 Enum은 다른 언어들과는 다르게 클래스 형태로 관리된다. 상수의 의미를 담고 있지만 단순히 상수를 넘어, 상태와 행위를 스스로 관리하는 객체지향의 의미로 확장된 클래스로 볼 수 있다.
기본 사용법은 다음과 같다.
public enum MENU{
PIZZA, COLLA //각각 0, 1의 상수로 관리된다.
}
그런데 특이하게도 상수를 싱글톤 객체로 관리한다. 즉, 상수와 함께 다른 프로퍼티들을 넣을 수 있다.
다음 예시를 보자.
public enum Menu{
PIZZA("피자"),
COLLA("콜라"),
MARATANG("마라탕")
private final String menuName;
Menu(String menuName){
this.menuName = menuName;
}
}
상수 옆에 문자열이 붙었다. 그리고 생성자와 멤버변수가 추가됐는데, 싱글톤 형태로 객체들이 관리된다.
실제로 객체가 같은지 확인해보자.
Menu pizza1 = Menu.PIZZA;
Menu pizza2 = Menu.PIZZA;
System.out.println("identity: " + System.identityHashCode(pizza1));
System.out.println("identity: " + System.identityHashCode(pizza2));
/*
identity: 1239731077
identity: 1239731077
*/
또한 Enum 객체는 내부적으로 equals를 프로퍼티마다 다르게 구분할 수 있도록 오버라이딩 해놓았기 때문에 다음과 같은 비교가 가능하다.
Menu pizza1 = Menu.PIZZA;
Menu pizza2 = Menu.PIZZA;
System.out.println(pizza1 == pizza2); //true가 반환된다.
System.out.println(pizza1.equals(pizza2)); //true가 반환된다.
==는 객체 레퍼런스 비교인데 어떻게 equals와 같은 동작을 하는걸까. 논리적으로 상수는 ==, !=와 같이 기본 연산자로 비교가 돼야 하므로 자바에선 미리 equals와 같게 구현해놓았다.
'Java' 카테고리의 다른 글
모니터와 락에 대하여 (0) | 2022.03.10 |
---|---|
리플렉션에 대하여 (0) | 2022.03.03 |
제네릭에 대하여 (0) | 2022.02.26 |
일급 컬렉션에 대하여 (0) | 2022.02.16 |
Optional에 대하여 (0) | 2022.02.10 |