본문 바로가기

Java

Enum에 대하여

자바의 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