본문 바로가기
프로그래밍언어/Java

[자바의 정석] 12. 열거형(enums)

by qkzkdo 2023. 9. 29.
728x90

2.1 열거형이란?

열거형은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용하다.

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

 

class Card {
    enum Kind { CLOVER, HEART, DIAMOND, SPADE } //열거형 Kind를 정의
    enum Value { TWO, THREE, FOUR } //열거형 Value를 정의

    final Kind kind; //타입이 int가 아닌 Kind임에 유의하자.
    final Value value;
}

 

자바의 열거형은 '타입에 안전한 열거형(typesafe enum)'이라서 실제 값이 같아도 타입이 다르면 컴파일 에러가 발생한다. 이처럼 값뿐만 아디라 타입까지 체크하기 때문에 타입에 안전하다고 하는 것이다.

상수의 값이 바뀌면, 해당 상수를 참조하는 모든 소스를 다시 컴파일해야 하지만 열거형 상수를 사용하면, 기존의 소스를 다시 컴파일하지 않아도 된다.

 

 

2.2 열거형의 정의와 사용

열거형을 정의하는 방법

enum 열거형이름 { 상수명1, 상수명2, ... }

 

열거형에 정의된 상수를 사용하는 방법은 '열거형이름.상수명'이다. 클래스의 static변수를 참조하는 것과 동일하다.

 

열거형 상수간의 비교에는 '=='를 사용할 수 있다. equals()가 아닌 '=='로 비교가 가능하다는 것은 그만큼 빠른 성능을 제공한다는 얘기다. 그러나 '<', '>'와 같은 비교연산자는 사용할 수 없고 compareTo()는 사용가능하다.

 

모든 열거형의 조상 - java.lang.Enum

메서드 설명
Class<E> getDeclaringClass() 열거형의 Class객체를 반환한다.
String name() 열거형의 상수의 이름을 문자열로 반환한다.
int ordinal() 얼거형의 상수가 정의된 순서를 반환한다.(0부터 시작)
T valueOf(Class<T> enumType, String name) 지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다.

 

 

2.3 열거형에 멤버 추가하기

 열거형 상수의 값이 불연속적인 경우에는 이때는 다음과 같이 열거형 상수의 이름 옆에 원하는 값을 괄호()와 함께 적어주면 된다.

enum Direction { EAST(1), SOUTH(5), WEST(-1), NORTH(10) }

그리고 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해 주어야 한다.

 

 

2.4 열거형의 이해

열거형의 이해를 돕기 위해 열거형이 내부적으로 어떻게 구현되어있는지 설명하고자 한다.

만일 열거형 Direction이 다음과 같이 정의되어 있을 때,

enum Direction { EAST, SOUTH, WEST, NORTH }

사실은 열거형 상수 하나하나가 Direction객체이다. 위의 문장을 클래스로 정의한다면 다음과 같을 것이다.

 

class Direction {
    static final Direction EAST = new Direction("EAST");
    static final Direction SOUTH = new Direction("SOUTH");
    static final Direction WEST = new Direction("WEST");
    static final Direction NORTH = new Direction("NORTH");

    private String name;

    private Direction(String name) {
        this.name = name;
    }
}

Direction클래스의 static상수 EAST, SOUTH, WEST, NORTH의 값은 객체의 주소이고, 이 값은 바뀌지 않는 값이므로 '=='로 비교가 가능한 것이다.

 

 

 

출처 : 남궁성. 「자바의 정석」. 도우출판. 2016

728x90