본문 바로가기

자바(JAVA)
[자바(Java)] 열거형(enum)

//열거형(enums)

- 관련된 상수들을 같이 묶어 놓은 것.

- Java는 값과 타입을 모두 체크함.

- 열거형 정의

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


- 열거형 상수의 비교에 == | compareTo() 사용 가능 // < | > 와 같은 비교 연산자는 사용xx


//                0      1      2     3
enum Direction { EAST, SOUTH, WEST, NORTH }

public class Ex04 {
	public static void main(String[] args) {
		 Direction d1 = Direction.EAST; //열거형타입.상수이름 // 가장 많이 사용
		 Direction d2 = Direction.valueOf("WEST");
		 Direction d3 = Enum.valueOf(Direction.class, "EAST");
		 
		 System.out.println("d1 = " + d1);
		 System.out.println("d2 = " + d2);
		 System.out.println("d3 = " + d3 + "\n");
		 
		 
		 System.out.println("d1 == d2 ? : " + (d1==d2));
		 System.out.println("d1 == d3 ? : " + (d1==d3));
		 System.out.println("d1.equals(d3) ? : " + (d1.equals(d3)));
		 System.out.println("d1.compareTo(d2) ? : " + (d1.compareTo(d2))); // 0 - 2 = -2
		 System.out.println("d1.compareTo(d3) ? : " + (d1.compareTo(d3)) + "\n"); // 0 - 0 = 0
		 
		 switch(d1) {
		 	case EAST:
		 		System.out.println("d1 : The direction is EAST."); break;
		 	case SOUTH:
		 		System.out.println("d1 : The direction is SOUTH."); break;
		 	case WEST:
		 		System.out.println("d1 : The direction is WEST."); break;
		 	case NORTH:
		 		System.out.println("d1 : The direction is NORTH."); break;
		 	default:
		 		System.out.println("d1 : Invalid direction."); break;
		 } //end of d2 switch
		 
		 switch(d2) {
		 	case EAST:
		 		System.out.println("d2 : The direction is EAST."); break;
		 	case SOUTH:
		 		System.out.println("d2 : The direction is SOUTH."); break;
		 	case WEST:
		 		System.out.println("d2 : The direction is WEST."); break;
		 	case NORTH:
		 		System.out.println("d2 : The direction is NORTH."); break;
		 	default:
		 		System.out.println("d2 : Invalid direction."); break;
		 } //end of d2 switch
		 System.out.println();
		 
		 Direction[] dArr = Direction.values(); // 열거형의 모든 상수를 배열로 반환
		 for(Direction d : dArr) { // for(Direction d : Direction.values())
			 System.out.println(d.name() + " = " + d.ordinal());
		 }
	}//end of main method
}//end of ex04 class

- 열거형 상수의 이름을 문자열로 반환

enum명.name();

- 열거형 상수가 정의된 순서 반환

enum명.ordinal();

- 지정된 열거형에서 name과 일치하는 열거형 상수 반환

enum명.valueOf([enumType], name);


package com.sorrel012.tips;

import java.util.Arrays;

enum Season {
	
	Winter(1), Spring(2), Summer(3), Fall(4);
	
	private int value;
	
	private Season(int value) {
		this.value = value;
	}
	
	public int getValue() {
		return this.value;
	}
	
	
}

public class EnumRunner {

	public static void main(String[] args) {
		Season season = Season.Winter;
		System.out.println(season);
		
		Season season1 = Season.valueOf("Spring");
		System.out.println(season1);
		System.out.println();
		
		System.out.println("winter's index: " + season1.ordinal()); //enum에서 winter의 순서(index)
		System.out.println("winter's value: " + season1.getValue()); //enum에서 winter에게 할당한 값
		
		System.out.println("summer's index: " + Season.Summer.ordinal()); //enum에서 Fall의 순서(index)
		System.out.println("summer's value: " + Season.Fall.getValue()); //enum에서 Fall의 순서(index)
		
	System.out.println("enum: " + Arrays.toString(Season.values())); // enum의 모든 값 출력

	} //main
	
}

// 열거형에 멤버 추가하기

- 불연속적인 열거형 상수의 경우, 원하는 값을 괄호 안에 적는다.
    ~ 괄호()를 사용하려면, 인스턴스 변수와 생성자를 새로 추가해 줘야 한다.
    ~ 열거형의 생성자는 외부에서 호출 불가.(private)

enum Direction {
	EAST(1), SOUTH(5), WEST(-1), NORTH(10);
    
    private final int value; // 인스턴스 변수 추가
    Direction(int value) { this.value = value; } // 생성자 추가(private 생략)
    
    public int getValue() { return value; }
}

enum Direction2 {
	EAST(1, ">"), SOUTH(2, "V"), WEST(3, "<"), NORTH(4, "^");
	
	private static final Direction2[] DIR_ARR = Direction2.values();
	private final int value;
	private final String symbol;
	
	Direction2(int value, String symbol) {
		this.value = value;
		this.symbol = symbol;
	}
	
	public int getValue() { return value; }
	public String getSymbol() { return symbol; }
	
	public static Direction2 of(int dir) {
		if (dir < 1 || dir > 4) {
			throw new IllegalArgumentException("Invalid value : " + dir);
		}
		return DIR_ARR[dir - 1];
	}
	
	public Direction2 rotate(int num) { //방위표 기준으로 시계방향으로 90*num 만큼 회전.
		num = num % 4;
		
		if(num < 0) { num += 4; }
		
		return DIR_ARR[(value-1+num) % 4];
	}
	
	public String toString() {
		return name() + getSymbol();
	}
}// end of enum Direction2

public class Ex05 {
	public static void main(String[] args) {
		for (Direction2 d : Direction2.values()) {
			System.out.println(d.name() + " = " + d.getValue());
		} System.out.println();
		
		Direction2 d1 = Direction2.EAST;
		Direction2 d2 = Direction2.of(1);
		
		System.out.println("d1 = " + d1.name() + ", " + d1.getValue());
		System.out.println("d2 = " + d2.name() + ", " + d2.getValue() + "\n");
		
		System.out.println(Direction2.EAST.rotate(1));
		System.out.println(Direction2.EAST.rotate(2));
		System.out.println(Direction2.EAST.rotate(-1));
		System.out.println(Direction2.EAST.rotate(-2));
	}
}

'자바(JAVA)' 카테고리의 다른 글

[자바(Java)] 쓰레드(Thread)  (0) 2022.12.18
[자바(Java)] 애너테이션  (0) 2022.12.17
[자바(Java)] 제네릭(Generics)  (1) 2022.12.17
[자바(Java)] Collections  (0) 2022.12.16
[자바(Java)] Set  (0) 2022.12.16