[Java] enums

eeminsu·2021년 11월 24일
0
post-thumbnail

자바의 정석을 통해 공부한 내용을 요약하였습니다

1. 열거형이란?

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{
	// 0 1 2 3
	enum Kind { CLOVER, HEART, DIAMOND, SPADE }; // 열거형 Kind 정의
	
	// 0 1 2
	enum Value { TWO, THREE, FOUR }; // 열거형  Value 정의
	
	final Kind kind;
	final Value value;
}
  • 서로 관련된 상수를 편리하게 선언하기 위한 것, 관련된 상수들을 같이 묶어 놓은 것
  • 자바는 타입에 안전한 열거형을 제공한다.
if(Card.CLOVER == Card.TWO) // true이지만 false어야 의미상 맞음
if(Card.Kind.CLOVER == Card.Value.TWO) // 컴파일 에러, 값은 같으나 타입이 다름
  • 값 뿐만 아니라 타입까지 체크하기 때문에 타입에 안전하다고 하는 것이다.
  • 상수의 값이 바뀌면 해당 상수를 참조한 모든 소스를 다시 컴파일 해야하지만 열거형 상수를 사용하면 다시 컴파일을 하지 않아도 된다.


2. 열거형의 정의와 사용

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

  • 위와 같이 열거형을 정의하면 된다.
  • 사용 방법은 '열거형이름.상수명'이다.
    클래스의 static 변수를 참조하는 것과 동일하다.
  • 열거형 상수간의 비교에는 '=='를 사용할 수 있다.
    그러나 '<','>'와 같은 비교연산자는 사용할 수 없으며 compareTo()는 사용 가능하다.
    비교대상이 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수를 반환한다.
enum Direction {EAST, SOUTH, WEST, NORTH}
Direction dir = Driection.EAST;
switch(dir) 
{
	case EAST: // Direction.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;
	default:
		System.out.println("Invalid direction."); 
		break;
}
  • 위처럼 switch문의 조건식에도 열거형을 사용할 수 있다,


3. java.lang.Enum

  • 모든 열거형의 조상클래스이다.

3-1. 메서드

  • String name() - 열거형 상수의 이름을 문자열로 반환
  • int ordinal() - 열거형 상수의 정의된 순서를 반환(0부터 시작)
  • T valueOf(Class< T> enumType, String name) - 지정된 열거형에서 name과 일치하는 열거형 상수 반환

3-2. 컴파일러가 자동으로 추가하는 메서드

  • static E values() - 열거형 상수가 가지고 있는 모든 상수를 배열로 반환
  • static E valueOf(String name) - 열거형 상수에 이름을 입력하면 해당하는 열거형 상수를 반환
Direction[] dArr = Direction.values();

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



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; } // 생성자 추가
	
	public int getValue() { return value; }
}
  • 열거형의 생성자는 제어자가 묵시적으로 private이기 때문에 객체를 생성할 수 없다.


5. 열거형의 이해

  • 열거형은 상수 하나하나가 객체이다.
  • 열거형 클래스의 열거형 상수 값은 객체의 주소이고 이 값은 바뀌지 않는 값이므로 '==' 비교가 가능한 것이다.
profile
안되면 될 때까지

0개의 댓글