개발하시면서 Enum은 많이 쓰시나요?
저 같은 경우는 회사 다니는 동안에는 사실 Enum을 아주 가끔 쓸 뿐 거의 사용하지 않았었는데요.
회사 그만두고 하는 작업에서는 Enum을 꽤 자주 사용하고 있습니다.
생각보다 편한 부분도 많고 코드 가독성도 좋아지는 것 같고 이래저래 장점이 많은데, 이 부분은 다른 포스트에서 이야기하기로 하고요.
앞으로 몇 개의 포스트가 될지는 모르겠지만 한동안은 Enum에 대한 포스트가 자주 올라가게 될 것 같습니다.
오늘 소개해드릴 것은 그 첫 편으로 자바 개발자가 반드시 알아야 할 Enum의 18가지 포인트에 대한 Pramod Bablad의 DZone에 올라온 글을 간단히 정리하겠습니다. 대부분 아시는 내용일 테고, 혹시 Enum을 아직 쓰지 않거나 잘 모르시는 분들을 위한 내용이라고 생각하시고 봐 주시기 바랍니다.
아래 원문 링크 한번 눌러주세요. (바로 창 닫지 마시고 잠시 열어놓으시면 더 고맙겠네요)
원문 : https://dzone.com/articles/18-points-every-java-developer-should-know-about-e
1. 정해져 있는 것은 아니지만, Enum의 Constant 들은 대문자로 사용합니다.
2. Enum이 비록 클래스가 아니지만, 클래스와 같이 Field, Constructor, Method를 가질 수 있습니다.
3. Enum의 Constructor(생성자)는 private 으로 선언해야 합니다. 이것은 매우 당연하죠. Enum을 new 로 생성하는 것이 가능하면 안되겠지요?
4. Enum Constant(열거형 상수)는 전체 실행에서 단 한 번만 생성됩니다. 모든 Enum Constant는 그중 하나가 코드에서 사용될 때 생성되고, 각 Enum 상수가 생성될 때 해당 Constructor가 호출됩니다.
5. Enum Constant는 Field, Constructor, Method보다 앞에서 정의되어야 합니다.
6. 모든 Enum은 java.lang.Enum을 상속합니다. 자바에서는 다중 상속이 지원되지 않기 때문에 당연하게도 Enum은 다른 클래스를 상속할 수 없습니다.
7. 상속은 안 되지만 interface는 구현이 되겠지요? (implement)
8. Enum Constant는 Constant Specific Body라고 불리는 자신만의 Body를 가질 수 있습니다. 이 Body 부분에 Field나 Method 를 정의할 수 있지만, 이 들은 해당 Body 내에서만 사용할 수 있습니다.
9. Enum은 자동으로 final로 선언됩니다. 따라서 다른 Enum에서 상속할 수 없어요.
10. 각각의 Enum type은 별개의 파일로 작성되어야 하고, 컴파일한 후에 .class 파일이 생성됩니다.
11. Enum type은 인스턴스 초기화 블록(Instance initialization block)뿐 아니라 정적 초기화 블록(Static initialization block)을 원하는 만큼 가질 수 있습니다. (https://stackoverflow.com/questions/11419519/enums-static-and-instance-blocks. 이 질문을 참고하시면 앞의 4번을 포함해서 좀 더 이해가 쉽겠네요)
12. 모든 Enum Type은 Comparable과 Serializable을 구현하고 있기 때문에 자동으로 모든 Enum Type은 비교 가능하고 직렬화 가능합니다.
13. Enum Constant(열거형 상수들)은 == 연산자로 비교할 수 있습니다. (하지만 저는 그냥 equals()를 사용합니다)
14. 어떤 Enum type의 constant도 values() 메소드로 조회할 수 있습니다. values() 메소드는 enum costant 들의 배열을 반환합니다.
15. Enum은 컴파일하는 동안 type-safety를 제공합니다. 즉, 정의되지 않은 enum constant를 사용한 경우 컴파일 중 오류가 발생합니다.
16. Enum은 클래스 밖 또는 안에서 정의할 수 있지만, method나 block 안에서는 정의할 수 없습니다.
17. ordinal() 메소드는 Enum type 안에서의 Constant의 순서를 반환하는 데 사용됩니다. (그래서 정의된 순서가 달라지면 ordinal() 의 값이 변경됩니다. DB에 Ordinal을 그냥 사용하는 경우에는 조심해야하죠)
18. Enum은 주로 전체 실행에 대해서 일정하게 유지되는 제한된 옵션의 집합이나 컴파일 동안 가능한 모든 옵션을 알고 싶은 경우에 사용됩니다. 예를 들어 메뉴의 선택 값들이거나 콤보박스의 옵션들이 있습니다. (그러나 실제로는 메뉴나 콤보박스의 옵션들에 Enum 을 넣는 경우는 많지 않더군요..)
뭐 거의 직역에 가깝게 정리가 되어버렸네요.
원본 글을 읽어주셔야 저작자들이 도움이 됩니다. (페이지 조회수가 늘어나니까요)
주로 외국 포스트를 공유하는 글들을 많이 올립니다만, 매번 원 저작자들에게 굉장히 죄송한 마음을 가지게 되네요.
댓글
댓글 쓰기