-
enum에 대해서 알아보자 (java.lang.Enum 클래스 상속)스터디/JAVA 2023. 3. 1. 23:31728x90
코드를 작성하다 보면 서로 관련이 있지만 독립적인 값들을 하나의 그룹으로 묶어 관리하고 싶을 때가 있습니다.
이럴 때 유용하게 사용할 수 있는 것이 Java의 'enum'입니다.enum은 Enummeration의 약자로 "열거"라는 뜻을 갖는데, Java에서는 서로 관련 있는 상수들을 한 곳에서 관리할 수 있도록 도와주는 기능으로 enum을 제공하고 있습니다.
이번 포스팅에서는 Java의 enum을 어떻게 활용하고 어떤 특징이 있는 지 알아보겠습니다.언제 enum을 사용하면 좋을까?
enum의 가장 큰 장점은 개발자가 해당 서비스에 필요한 문맥을 담을 수 있는 것이라고 생각합니다.
예를 들어, 에러 메시지와 에러 코드를 한 곳에서 관리하고 싶다고 가정해보면 아래와 같이 enum을 만들 수 있습니다.
public enum ErrorType { SERVER_ERROR("E000", "Server error."), INVALID_REQUEST_ERROR("E001", "Invalid request."); private final String code; private final String message; ErrorType(String code, String message) { this.code = code; this.message = message; } }
만약 enum을 사용하지 않았다면 아래와 같은 클래스를 만들어야 할 지도 모릅니다.
public class ErrorType { public static final String SERVER_ERROR_CODE = "E000"; public static final String SERVER_ERROR_MESSAGE = "Server error."; }
위와 같이 클래스를 만들게 되면, SERVER_ERROR_CODE와 SERVER_ERROR_MESSAGE가 관련 있는 지는 개발자가 눈으로 밖에 확인할 수 없습니다. 그러나, enum을 사용하게 되면 관련이 있는 것들끼리 묶을 수 있어 관리하기가 편합니다.
java.lang.Enum 클래스 상속
enum의 모든 객체는 java.lang.Enum 클래스를 상속받습니다. 따라서 enum 내부의 각 요소는 독립적인 객체로 취급됩니다.
public abstract class Enum<E extends Enum<E>> implements Constable, Comparable<E>, Serializable { private final String name; private final int ordinal; protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } public final String name() { return name; } public final int ordinal() { return ordinal; } ... }
앞서 언급했듯이, enum으로 선언된 각 상수들은 추상 클래스인 Enum을 상속한 객체입니다. 각 객체는 name과 ordinal이라는 필드를 가지며, 이를 반환하는 name() 및 ordinal() 메서드를 제공합니다. 뿐만아니라, Enum에서는 compareTo(), valueOf()와 같은 다양한 메서드도 함께 제공합니다.
Enum 클래스의 생성자는 protected로 선언되어 있습니다. 이는 개발자가 직접 생성자를 호출하지 못하도록 막는 동시에, 컴파일러에서만 호출할 수 있도록 하기 위함입니다. 그리고, enum의 생성자는 private으로 지정되는데, 이는 enum이 고정된 상수들의 집합으로 존재하도록 하기 위해서입니다.
즉, 컴파일 타임에 모든 값을 결정하여, 런타임 동안 변경되지 않도록 보장하는 역할을 합니다.
그리고, 컴파일 시에 values()와 valueOf 메서드는 컴파일러가 자동으로 모든 열거형에 추가해줍니다.그렇다면, 컴파일 타임에 enum의 모든 인스턴스가 생성되는 것일까?
public enum Month { JANUARY("1월"), FEBRUARY("2월"), MARCH("3월"), APRIL("4월"), MAY("5월"), JUNE("6월"), JULY("7월"), AUGUST("8월"), SEPTEMBER("9월"), OCTOBER("10월"), NOVEMBER("11월"), DECEMBER("12월"); private final String koreanName; Month(String koreanName) { System.out.println(koreanName + "객체 생성"); this.koreanName = koreanName; } }
public class Main { public static void main(String args[]){ String name = JANUARY.name(); System.out.println(name); // JANUARY int ordinal = JANUARY.ordinal(); System.out.println(ordinal); // 0 } }
위 코드를 실행시켜보면, 아래와 같은 결과가 나옵니다.이를 통해 컴파일 타임에 객체가 생성되는 것이 아니라, 단순히 어떤 값이 들어가야 하는지만 결정된다는 것을 알 수 있습니다.
실제로 객체가 생성되는 시점은 enum의 열거형 값 중 하나가 처음 사용될 때이며, 이때 모든 enum 인스턴스가 함께 생성됩니다.또한, 각 열거형은 객체이므로 당연히 Heap 영역에 저장됩니다.
지금까지 enum에 대해 공부한 내용을 정리해 보았습니다. 평소 자주 사용하던 기능이지만, 내부 구조에 대해 깊이 알지 못해 궁금했었는데 이번 기회를 통해 이해할 수 있어 뜻깊었습니다.참고하면 좋을 링크)
https://techblog.woowahan.com/2527/Java Enum 활용기 | 우아한형제들 기술블로그
안녕하세요? 우아한 형제들에서 결제/정산 시스템을 개발하고 있는 이동욱입니다. 이번 사내 블로그 포스팅 주제로 저는 Java Enum 활용 경험을 선택하였습니다. 이전에 개인 블로그에 Enum에 관해
techblog.woowahan.com
☕ 자바 Enum 열거형 타입 문법 & 응용 💯 정리
Enum 열거 타입 먼저 Enum은 "Enumeration"의 약자다. Enumeration은 "열거, 목록, 일람표" 라는 뜻을 가지고 있으며, 보통 한글로는 열거형이라고 부른다. 즉, 열거형(enum)은 요소, 멤버라 불리는 명명된 값
inpa.tistory.com
728x90'스터디 > JAVA' 카테고리의 다른 글
String vs StringBuilder vs StringBuffer (0) 2023.05.27 정적 팩토리 메서드 언제 사용해야할까? (1) 2023.05.23 Atomic에 대해서 알아보자 (0) 2022.12.26 JVM에 대해서 알아보자! (0) 2022.12.24 Record에 대해서 알아보자 (0) 2022.07.17