열거형(enum)

Java

목록 보기
18/26
post-thumbnail

1. 열거형(enum)이란?

  • 관련된 상수들을 같이 묶어놓은 것. java는 타입에 안전한 열거형을 제공
class Card{
	static final int CLOVER = 0;
    static final int HEART = 1;
    static final int DIAMOND = 2;
    static final int SPADE = 3;
    
    static final int TWO = 0;
    static final int THREE = 1;
    static final int FOUR = 2;
	
    final int kind;
    final int num;
}
class Card{
enum Kind {CLOVER,HEART,DIAMOND,SPADE}	//열거형 Kind를 정의
enum Value {TWO,THREE,FOUR}				//열거형 Value를 정의
final Kind kind;
final Value value;
}

if(Card.COVER == Card.TWO) >> ture이지만 False여야 의미상 맞음
if(CARD.Kind.CLOVER == Card.Value.TWO >> 컴파일 에러. 타입이 달라서 비교 불가

1-1. 열거형 정의 방법

enum Direction {EAST, SOUT, WEST, NORTH}
`enum 열거형 이름 {상수명1, 상수명2,...}

class Unit {
	int x, y;
    Direction dir;			//저 네가지 값 중에 하나만 들어올 수 있음
    
    coid init() {
    dir = Direction.EAST;
    }
}
  • 열거형 상수의 빅에 ==와 compareTo() 사용가능
if(dir == Direction.EAST) {
x++;} else if (dir>= Direction.WEST) {
}				>>❌ ERROR! 열거형 상수에 비교연산자 사용 불가
else if (dir.compareTO(DIrection.WEST) > 0) {
}								>>⭕ compareTo 비교연산자는 사용 가능

! compareTo :
왼쪽이 크면 양수 / 오른쪽이 크면 음수 / 같으면 0 반환

1-2. 열거형의 조상 : java.lang.Enum 클래스

  • 모든 열거형은 Enum의 자손이며, 아래의 메서드를 상속받는다.
  • values(), valueIf()는 컴파일러가 자동으로추가
static E[] values()
static E   valuesOf(String name)
Direction[] dArr= Direction.values();
for(Direction d : dArr) 
System.out.printf("%s=%d%n", d.name(), d.ordinal());
Direction d = Direction.valueOf("WEST");

1-3. 열거형의 정체! : 객체다

enum Direction {EAST, SOUTH, WEST,NORTH }

public class EnumEx {

	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.equals(d3) ? " + d1.equals(d3)); //true
		
		//객체이기 때문에 산술연산자 사용 불가❌
		System.out.println("d2 > d3 ? "+ (d1 > d3));   //Error	
	}
}
  • 비교는 순서?로 하나봄
System.out.println("d1.CompareTo(d2) ? " + (EAST.compareTo(WEST)));
>> 결과 = -2;

  • case문 쓸 때 문법
		switch(d1) {					
		case EAST : 			>>Direction.EAST라고 쓸 수 없다
			System.out.println("EAST"); break;
		case WEST : 
			System.out.println("WEST"); break;
		case SOUTH : 
			System.out.println("SOUTH"); break;
		}
  • values : 열거형의 모둔 상수를 배열로 변환
Direction[] dArr = Direction.values();

for (Direction d : Arr) 
		System.out.printf("%s=%d%n", d.name(), d.ordinal());

ordinal : 해당 상수가 가진 순서를 반환.
name : 값을 반환

![](https://velog.velcdn.com/images/gpfl5202/post/58886fb9-df9e-4633-958c-db00d8d1da92/image.png)

1-4. 열거형에 멤버 추가하기

  • 불연속적인 열거형 상수의 경우, 원하는 값을 괄호()안에 적는다.
enum Direction {EAST(1), SOUTH(5),WEST(-1), NORTH(10)}
  • 괄호()를 사용하려면, 인스턴스 변수와 생성자를 새로 추가해 줘야 한다.
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;}	
}
  • 열거형 생성자는 묵시적으로 private이므로, 외부에서 객체 생성 불가
Direction d = new Direction(1);
  • 예제
enum Direction {
	EAST(1, ">"), SOUTH(5,"V"), WEST(-1,"<"), NORTH(10,"^");			//끝에 ;를 추가해야한다.
	
	private static final Direction[] DIR_ARR = Direction.values();		//이거는 남궁쌤이 넣은 거.
	private final int value;				//상수 선언
	private final String symbol;			//상수 선언
	
	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) 
			throw new IllegalArgumentException("Invalid value :" + dir);
		
		return DIR_ARR[dir -1];
	}		
}
enum Direction {
	EAST(1, ">"), SOUTH(5,"V"), WEST(-1,"<"), NORTH(10,"^");			//끝에 ;를 추가해야한다.
	
	private static final Direction[] DIR_ARR = Direction.values();		//이거는 남궁쌤이 넣은 거.
	private final int value;				//상수 선언
	private final String symbol;			//상수 선언
	
	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) 
			throw new IllegalArgumentException("Invalid value :" + dir);
		
		return DIR_ARR[dir -1];
	}	
	
	public Direction rotate(int num) {
		num = num %4;
		if(num<0) num +=4;
				return DIR_ARR[(value -1+num) %4]; 
	}	
}

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);	
	}
}

시계방향

너무 어렵다 하지 마시고 나중에 실무에 쓰다 모르면 다시 참고하세요.

0개의 댓글