[자바의 정석] Enum

YJS·2023년 12월 11일
0

1. enum 정의하는 방법


열거형이란?

-JDK1.5부터 추가

-타입에 안전한 열거형: 실제 값과 타입이 일치해야 같다고 인식.(서로 다른 개념이나 동일 이름을 가진 값의 충돌을 막을 수 있음)

<정의방법>

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

enum Direction {EAST, SOUTH, WEST, NORTH}

class Unit{
int x, y;
Direction dir;
void init(){
	dir = Direction.EAST;
	}
}

if (dir == Direction.EAST){
	x++;
}else if(dir.compareTo(Direction.WEST) > 0) {
...

//첫줄에 열거할 상수의 이름을 선언
//이름은 대문자로 선언하는 것이 관례
//각 상수는 콤마로 구분(제일 마지막 상수의 끝에는 세미콜론을 붙여야 하나,
//간단히 상수의 이름만 선언할 때는 세미콜론을 붙이지 않아도 됨)

-열거형의 상수간의 비교에는 ==와 compareTo 사용 가능.(단, <,>비교 연산자 사용 불가능)

자바 enum의 특징

  1. enum에 정의된 상수들은 해당 enum type의 객체임.
  2. 생성자와 메서드를 추가할 수 있음.(enum이 클래스이기 때문)

→ enum 생성자의 접근제어자는 private이기 때문에 외부에서 상수 추가 불가능.

→ 상수 하나당 각각의 인스턴스가 만들어지며 모두 public static final 임.

enum Currency {

    PENNY(1), NICKLE(5), DIME(10), QUARTER(25);

    private int value;

    Currency(int value) {
        this.value = value;
    }

    public int value() {
        return value;
    }
}

public class EnumDemo {

    public static void main(String[] args) {
        System.out.println(Currency.DIME.value());    // 10
    }
}

2. enum이 제공하는 메소드 (values()와 valueOf())


-values() : 열거형의 모든 상수를 배열에 담아 반환. (모든 열거형이 가지고 있는 메서드로 컴파일러가 자동으로 추가해 줌)

Direction []dArr = Direction.values();
for(DIrection d: dArr)
	System.out.printf("%s =%d%n", d.name, d.ordinal());
enum Transport {
    BUS, TAXI, SUBWAY;
}

public class EnumDemo {

    public static void main(String[] args) {
        for (var e : Transport.values()) {
            System.out.println(e.name()); // BUS, TAXI, SUBWAY반환
        }
				Transport taxi = Enum.valueOf(Transport.class, "Taxi");
		    Transport bus = Transport.valueOf("BUS");
    }
}

-valueOf(enumType, String name) : 지정된 열거형에서 name과 일치하는 열거형을 반환.

3. java.lang.Enum


-모든 열거형의 조상

→모든 열거형은 Enum 클래스를 상속받기 때문에 enum type은 별도의 상속을 받을 수 없음.

<Enum 클래스에 정의된 메서드>

메서드설명
ClassgetDeclaringClass()열거형의 class 객체 반환
String name()열거형 상수의 이름을 문자열로 반환
int ordinal()상수가 정의된 순서를 반환(0부터시작)
T valueOf(ClassenumType, String name)지정된 열거형에서 name과 일치하는 열거형 상수를 반환

4. EnumSet


출처: https://www.geeksforgeeks.org/enumset-class-java/

-EnumSet은 AbstractSet 클래스를 상속하고 Set 인터페이스를 구현함.

-오직 열거형 상수만을 값으로 가질 수 있고 모든 값은 같은 enum type이어야 함.

-null value를 추가하는 것을 허용하지 않음. NullPointerException을 던지는 것도 허용하지 않음.

-ordinal 값의 순서대로 요소가 저장됨.

-tread-safe하지 않음. 동기식으로 사용하려면 Collections.synchronizedMap을 사용하거나, 외부에서 동기화를 구현해야함.

-모든 메서드는 arithmetic bitwise operation을 사용하기 때문에 모든 기본 연산의 시간 복잡도가 O(1)임.

profile
우당탕탕 개발 일기

0개의 댓글