[Java] Enum class

박종건·2024년 3월 15일

Enum이란?

Enum은 Enumeration의 약자로 "열거, 목록, 일람표" 라는 뜻을 가지고 있다.
즉, Enum은 상수값을 대표하는 이름들의 집합을 이루는 자료형이다.

대표적으로 '요일(7가지)' 이나 '계절(4가지)', '주사위(6가지)' 같은 예제를 들 수 있으며, 이와 같이 한정된 데이터 묶음을 Enum으로 묶어주면 구조적으로 프로그래밍이 가능하다.

Enum의 장점

  • 코드가 단순해지며 가독성이 좋아진다
  • 허용 가능한 값들을 제한하여 타입 안정성(type safe)을 제공한다.
  • 리팩토링시 변경 범위가 최소화 된다 (enum에서 한번에 관리하기 때문에 내용의 추가가 필요하더라도, Enum 코드외에 수정할 필요가 없다)
  • 기본적으로 직렬화 가능하므로 Serializable 인터페이스를 구현할 필요가 없고, 리플렉션 문제도 발생하지 않는다.

Enum의 선언

// 요일 열거 타입
enum Week {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

//할당
week = Week.MONDAY

// 계절 열거 타입
enum Season {
    Spring,
    Summer,
    Autumn,
    Winter
}

//할당
season = Season.Spring

// 주사위 열거 타입
enum Dice {
    One,
    Two,
    Three,
    Four,
    Five,
    Six
}

Enum 참조 방식

Enum 타입은 primitive 타입이 아닌 referece 타입으로 분류되며, 그래서 enum 상수값은 힙(heap) 영역에 저장된다.

그래서 같은 enum 타입 변수 끼리 같은 상수 데이터를 바라봄으로써 둘이 주소를 비교하는 == 연산 결과는 true가 된다.

Season now = null; // 참조 타입이기 때문에 null도 저장 가능
now = Season.Spring;

// 주소값 비교
System.out.println(today == Season.Spring); // true

Enum 메소드 종류

  • name() -> 열거 객체가 가지고 있는 문자열을 리턴
Season se = Season.Spring;

// 열거 객체의 문자열을 리턴
String season = se.name();
System.out.println(season); // Spring
  • ordinal() 메소드 -> 열거 타입을 정의 할 때 주어진 순번을 리턴
Season se = Season.Spring;

// 열거 객체의 문자열을 리턴
int seasonNum = se.ordinal();
System.out.println(season); // 0
  • compareTo() -> 매개값으로 주어진 열거 객체를 비교해서 순번 차이를 리턴
Season se1 = Season.Spring; // 0
Season se2 = Season.Winter; // 3


// 열거 객체가 매개값의 열거 객체보다 순번이 빠르다 → 음수를 리턴
int compare1 = se1.compareTo(se2); // Winter 기준으로 Spring 위치 (3에서 0가 되기 위한 값)
System.out.println(compare1); // -3

int compare2 = se2.compareTo(se1);
System.out.println(compare2); // 3
  • valueOf() -> 매개값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체를 리턴
// 문자열을 입력받아서 일치하는 열거 객체를 리턴
Season se3 = Season.valueOf("Spring"); // se3 변수는 Season.Spring 열거 객체를 참조하게 됨
System.out.println(se3); // Spring

-values() -> 열거 타입의 모든 열거 객체들을 배열로 만들어 리턴

// 모든 열거 객체들을 배열로 리턴
Season[] se4 = Season.values();

System.out.println(Arrays.toString(se4)); //
[Spring, Summer, Autumn, Winter]

for (Season type : Season.values()) { // 열거 순회
    System.out.println(type);  // 순서대로 열거 객체 출력
}
profile
될때까지 하자

0개의 댓글