열거형은 관련이 있는 상수들의 집합

- 인터페이스나 클래스 내에 선언해서 관리하던 상수들을 열거형에서 관리

 

열거형 특징

- 서로 관련있는 상수 값들을 모아서 관리

- 열거형은 Class처럼 사용할 수 있음, Class의 문법을 따름

- 상속X

- 생성자는 묵시적으로 private (public으로 하면 컴파일에러)

- 열거형은 static변수 처럼 클래스 로드 시점에 생성되는 것으로 그 이후에 맘대로 생성해서 사용할 수 없음

- 열거형을 만들면 클래스 로드 시점에 하나의 인스턴스로 생성되서 singletone으로 관리됨 > 병렬환경

- 열거형 사용시 코드 리팩토링이 수월함, 상수들을 열거형에서만 관리하므로 열거형 코드만 수정하면 됨

 

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

열거형에 정의된 상수를 사용하려면 '열거형이름.상수명' 으로 사용

 

 

values() : 열거형의 모든 상수를 반환

Direction[] dArr = Direction.values();

String name() : 열거형 상수의 이름을 문자열로 반환

int ordinal() : 열거형 상수가 정의된 순서를 반환 (0부터 시작)

valueOf(Class enumType, String name) : 지정한 열거형(enumType)에서 name과 일치하는 열거형 상수를 반환

valueOf()

valurOf(String name)

 

멤버 추가

- ordinal()을 사용하면 상수가 정의된 순서에 따라 int값을 반환하지만, 이 값을 상수의 값으로 사용하는 것은 지양

- 각 상수 값을 지정할 수 있음

- 지정된 값을 저장할 수 있는 열거형의 인스턴스 변수와 생성자를 만들어 줘야함

- 인스턴스 변수는 열거형 상수의 값을 저장하기 때문에 final로 선언

- 생성자의 제어자는 묵시적으로 private임

enum Direction {
	EAST(1), SOUTH(5), WEST(-1), NORTH(10);
    
    private final int value;
    Direction(int value) {this.value = value;}   // 묵시적으로 private Direction
    
    public int getValue(){
    	return value;
    }
    
}

 

 

package enumenum;

enum Direction {
	EAST(1, ">"), SOUTH(2, "V"), WEST(3, "<"), NORTH(4, "^"); 
	
	private final int value;
	private final String symbol;
	private static final Direction[] DIR_ARR = Direction.values(); 
	
	Direction (int value, String symbol){
		this.value = value;
		this.symbol= symbol;
	}
	
	public int getValue() {
		return value;
	}
	public String getSymbol() {
		return symbol;
	}
	
	public static Direction of(int dir) {
		if(dir < 1 || dir > 4) {
			System.out.println("Ivalid value : " + dir);
		}
		return DIR_ARR[dir - 1];
	}
	
	public Direction rotate(int num) {
		num = num % 4;		
		return DIR_ARR[(value - 1 + num) % 4];		
	}
	
	public String toString() {
		return name() + getSymbol();
	}
	
}

public class EnumEx {
	
	public static void main(String[] args) {
		
		for(Direction d : Direction.values()) {
			System.out.printf("%s=%d%n", d.name(), d.getValue());
		}
		
		Direction d1 = Direction.EAST;
		Direction d2 = Direction.of(1);
		
		System.out.printf("d1=%s, %d%n", d1.name(), d1.getValue());
		System.out.printf("d2=%s, %d%n", d2.name(), d2.getValue());
		
		System.out.println(Direction.EAST.rotate(1));
		System.out.println(Direction.EAST.rotate(2));		
	}
	
}

 

EAST=1
SOUTH=2
WEST=3
NORTH=4
d1=EAST, 1
d2=EAST, 1
SOUTHV
WEST<

 

참고

velog.io/@kyle/%EC%9E%90%EB%B0%94-Enum-%EA%B8%B0%EB%B3%B8-%EB%B0%8F-%ED%99%9C%EC%9A%A9

 

자바 Enum 기본 및 활용

우아하게 Enum 써 보입 시더 허허,,^^

velog.io

 

'JAVA > java' 카테고리의 다른 글

형변환  (0) 2021.02.28
Comparator, Comparable  (0) 2021.02.28
mutable과 immutable  (0) 2021.02.25
Java 날짜 유효성(포멧) 체크  (1) 2020.07.14
toString()  (0) 2020.04.20