서블렛으로 웹 프로젝트를 할 때 Service 객체를 Enum으로 생성한 예제가 있어서 Enum에 대해 자세히 정리하기 위해 작성해 본다.
Enum이 상수의 집합이라고 대충 알고 있어서 이 부분이 Service 객체의 싱글톤패턴과 관련이 있을 것 같은데, 정확한 이유와 구현 방법을 알고 싶어 공부하게 되었다.
우선 Enum의 정의이다. 오라클 java documentation에서는 아래처럼 정의하고 있다.
An
enum type is a special data type that enables for a variable to be a set of predefined constants. The variable must be equal to one of the values that have been predefined for it.
Common examples include compass directions (values of NORTH, SOUTH, EAST, and WEST) and the days of the week.
열거형은 변수가 미리 정의된 상수집합이 될 수 있도록 하는 특별한 데이터 유형. 일반적인 예로 동서남북과 같은 방향, 요일 등이 있다고 얘기한다. 연관된 상수의 집합으로 이해하면 될듯하다.
Enum에 대해 아래의 출처에서 너무 이해하기 쉽게 정리되어 있었다. 이렇게 이해하기 쉬운 글이 있다는 게 너무 행운이다.
https://inpa.tistory.com/entry/JAVA-☕-열거형Enum-타입-문법-활용-정리#
아래 내용은 위 주소에서 중요하다 싶은 부분을 따로 정리하고 궁금했던 부분을 추가하여 작성했다.
- Enum 은 독립된 특수한 클래스
- 일종의 객체이기 때문에 힙 메모리에 저장되며 각 enum 상수들은 별개의 메모리 주소를 가짐
- Enum의 장점
- 코드가 단순해지며 가독성이 좋아진다
- 허용 가능한 값들을 제한하여 유형 안전(type safe)을 제공한다
- 외부에서 인스턴스화할 수 없다.
- 컴파일 시에 컴파일 에러를 확인 가능 > 런타임 에러 감소
- 생성자의 접근제어자가 private이다. 일반적으로 상속을 받을 때 부모클래스의 생성자를 호출하기 때문에 상속도 불가능하다.
- 자체 클래스 상수와 달리 switch 문에서도 사용할 수 있다
- IDE의 적극적인 지원을 받을 수 있다
- 리팩토링시 변경 범위가 최소화된다
- Thread safe 인 싱글톤 객체이므로 싱글톤 클래스를 생성하는 데에도 사용된다
- JVM에서 인스턴스가 하나만 생성되도록 보장한다.
- Serializable 인터페이스를 내부적으로 구현하고 있어 직렬화 가능하다.
- 역직렬화를 하여도 jvm 이 싱글톤을 보장하기에 싱글톤을 유지 가능 하다.
여기까지 정리하는 것만 해도 여러 자료와 예시를 보며 이해하는데 오래 걸렸다... 오라클에서 자바에 대한 수많은 것들을 문서화하고, 많은 블로거들께서 포스팅하시는 게 정말 대단한 것 같다.
아무튼 책의 예제에서 Service 객체에 Enum을 사용한 것은 싱글톤 때문이라는 것을 알았다. 컨트롤러에서 요청을 받아 영속계층과 자료를 주고받고 다시 컨트롤러로 반환하는 과정에서 Service 객체는 하나일 필요가 있었던 것이고. 쉽게 구현하는 방법이 Enum을 사용하는 것이었다.
여기에 주요 메서드나 Enum 이 상속하는 클래스, 여러 활용법까지 정리하면 좋겠지만, 다른 것들도 공부해야 할 것이 너무 많아 실제 프로젝트를 구현하면서 사용할 때 설명하려고 한다.