Java/객체지향

[객체지향][열거형] - 열거형(enum)

얄루몬 2022. 2. 21. 21:17

https://youtu.be/ODHC-n4mpMY?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.


[열거형 enum]

  • 관련된 상수들을 같이 묶어 놓은 것을 의미한다. 
  • Java는 타입에 안전한 열거형을 제공한다.
    • C언어와 다르게 값과 타입을 모두 체크해준다. 
    • if(Card.CLOVER ==Card.TWO) 값은 같지만 타입이 달라서 컴파일 에러를 내준다. 
  • 열거형 상수는 객체이기 때문에 compareTo( )와 equals를 사용해야 한다. 또 예외적으로 ==도 허용된다.

 

[일반적으로 작성한 경우]

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, DIAMMOND, SPADE
	} //열거형 Kind 정의
	enum Value{
		TWO, THREE, FOUR
	}
	
	final Kind kind; //타입이 int가 아니고 Kind이다!
	final Value value;
}

 

 

[열거형의 정의와 사용]

 

  • 정의하는 방법 enum Direction { EAST, SOUTH, WEST, NORTH }
  • enum 열거형이름 { 상수명1, 상수명2, .... }
  • 열거형 타입의 변수를 선언하고 사용하는 방법
//열거형 타입의 변수 선언과 사용법
class Unit {
	int x, y; // 유닛 위치
	Direction dir; // 열거형 인스턴스 변수를 선언 (열겨형에 들어간 값만 사용가능)
	
	void init() {
		dir = Direction.EAST; // 유닛을 EAST 방향으로 초기화
	}

 

  • 열거형 상수의 비교에는 ==와 compareTo( )사용이 가능하다. 
if(dir == Direction.EAST) {
	x++;
} else if (dir > Direction.WEST) { //에러 열거형 상수에 비교연산자 사용 불가
	...
} else if (dir.compareTo(Direction.WEST) > 0) {
	//compareTo( )는 사용가능
}
  • 열거형 상수는 비교연산자= 를 사용할 수 없다. 이를 사용하고 싶다면 compareTo( )를 사용해야 한다.
    • 왼쪽이 클 땐 양수
    • 같으면 0
    • 오른쪽이 클 땐 음수

 

 

[열거형의 조상 - java.lang.Enum]

  • 모든 열거형은 Enum의 자손이며, 아래의 메서드를 상속 받는다.

  • values( ), valueOf( )는 컴파일러가 자동으로 추가해준다.

 

 

[실습]

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

public class Java12_5 {
	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);
		
		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("d2 > d3 ? "+ (d1>d3)); 에러
		
		System.out.println("d1.compareTo(d3) ? " +(d1.compareTo(d3)));
		System.out.println("d1.compareTo(d2) ? " +(d1.compareTo(d2)));
		
		
		switch(d1) { //이때 Direction.EAST라고 쓸 수 없다.
			case EAST:
				System.out.println("The Direction is EAST"); break;
			case SOUTH:
				System.out.println("The Direction is SOUTH"); break;
			case WEST:
				System.out.println("The Direction is WEST"); break;
			case NORTH:
				System.out.println("The Direction is NORTH"); break;
		}
		
		Direction[] dArr = Direction.values(); //열거형의 모든 상수를 배열로 반환
		
		for (Direction d : dArr) //for(Direction d : Direction.values())
			System.out.printf("%s=%d%n", d.name(), d.ordinal()); //순서
		
	}

}