열거형

mjjin·2023년 9월 23일
0

열거형 (enum)

  • 관련된 상수들을 같이 묶어 놓은 것. Java 타입에 안전한 열거형을 제공

AVA의 enum은 인터페이스와 같이 독립된 특수한 클래스로 구분한다. 즉, 일종의 객체이기 때문에 힙(heap) 메모리에 저장되며 각 enum 상수들은 별개의 메모리 주소값을 가짐으로써 완벽히 독립된 상수를 구성할 수 있는 것이다.

또한 IDE에서 클래스 파일을 생성할때 독립된 열거형 파일도 생성할 수 있다. (독립된 클래스이기 때문에)

Enum 선언

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

Enum 참조 방식

Enum 타입 객체도 하나의 데이터 타입이므로 변수를 선언하고 사용하면 된다.

// 열거타입 변수 = 열거타입.열거상수;
Week monday = Week.MONDAY;
Week sunday = Week.SUNDAY;

한가지 알아둘 점은 enum 타입은 특수한 클래스 라는 점이다.

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

String 처럼 스택 영역에 있는 변수들이 힙 영역에 있는 데이터의 주소값을 저장함으로써 참조 형태를 띄게 된다. 그래서 다음과 같이 같은 enum 타입 변수 끼리 같은 상수 데이터를 바라봄으로써 둘이 주소를 비교하는 == 연산 결과는 true가 되게 된다.

Week today = null; // 참조 타입이기 때문에 null도 저장 가능
today = Week.SUNDAY;

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

// enum Week 의 모든 상수값들을 배열로 변환
Week[] days = Week.values();


Enum 메소드 종류

enum Week {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

name() 메소드
열거 객체가 가지고 있는 문자열을 리턴
반환되는 문자열은 열거 타입을 정의할 때 사용한 상수 이름과 동일

Week w = Week.FRIDAY;

// 열거 객체의 문자열을 리턴
String weekName = w.name();
System.out.println(weekName); // "FRIDAY"

ordinal() 메소드
열거 타입을 정의 할 때 주어진 순번을 리턴
전체 열거 객체 중 몇 번째 열거 객체인지 알려준다

Week w = Week.FRIDAY;

// 열거 객체의 순번(0부터 시작)을 리턴
// 전체 열거 객체 중 몇 번째 열거 객체인지 알려준다
int weekNum = w.ordinal();
System.out.println(weekNum); // 4

compareTo() 메소드
매개값으로 주어진 열거 객체를 비교해서 순번 차이를 리턴
열거 객체가 매개값의 열거 객체보다 순번이 빠르다 → 음수를 리턴
열거 객체가 매개값의 열거 객체보다 순번이 늦다 → 양수를 리턴

// 열거 객체를 비교해서 순번 차이를 리턴 (시작점을 어느 열거 객체의 기준으로 몇번째 위치하는지)
Week w1 = Week.TUESDAY; // 2
Week w2 = Week.SATURDAY; // 6

// 열거 객체가 매개값의 열거 객체보다 순번이 빠르다 → 음수를 리턴
int compare1 = w1.compareTo(w2); // SATURDAY 기준으로 TUESDAY 위치 (6에서 2가 되기 위한 값)
System.out.println(compare1); // -4

// 열거 객체가 매개값의 열거 객체보다 순번이 늦다 → 양수를 리턴
int compare2 = w2.compareTo(w1); // TUESDAY 기준으로 SATURDAY 위치 (2에서 6가 되기 위한 값)
System.out.println(compare2); // 4

valueOf() 메소드
매개값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체를 리턴

// 문자열을 입력받아서 일치하는 열거 객체를 리턴
Week w3 = Week.valueOf("SUNDAY"); // w3 변수는 Week.SUNDAY 열거 객체를 참조하게 됨
System.out.println(w3); // SUNDAY

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

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

System.out.println(Arrays.toString(w4)); // [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]

for (Week type : Week.values()) { // 열거 순회
    System.out.println(type);  // 순서대로 열거 객체 출력
}

열거형에 멤버 추가하기

열거형의 이해

0개의 댓글