Java - Enum

iseon_u·2022년 5월 28일
0

Java

목록 보기
63/77
post-thumbnail

Enum 열거형


class Card {
		static final int SPADE = 0;
		static final int HEART = 1;
		static final int DIAMOND = 2;
		static final int CLOVER = 3;

		static final int TWO = 0;
		static final int THREE = 1;

		final int kind;
		final int num;
}
class Card {
		enum Kind { SPADE, HEART, DIAMOND, CLOVER } // 열거형 Kind 를 정의
		//            0,     1,      2,      3
		enum Value { TWO, THREE }

		final Kind kind; // 타입이 int 가 아닌 Kind
		final Value value;
  • 관련된 상수들을 같이 묶어 놓은 것, Java는 타입에 안전한 열거형을 제공
if(Card.Kind.SPADE==Card.Value.TWO) { // 컴파일 에러 ❌ 타입이 달라서 비교 불가
// 0 == 0
  • 비교시 값 & 타입 체크 후 비교

열거형의 정의와 사용

enum 열거형이름 { 상수명1, 상수명2, ... }
enum Direction { EAST, SOUTH, WEST, NORTH } // 0, 1, 2, 3
  • 열거형을 정의하는 방법
class Unit {
		Direction dir; // 열거형 인스턴스 변수 선언
		void init() {
				dir = Direction.EAST; // 유닛 방향을 EAST 로 초기화
		}
}
  • 열거형 타입의 변수를 선언하고 사용하는 법
if(dir==Direction.EAST) {
		x++;
} else if (dir > Direction.WEST) { // 에러 ❌ 열거형 상수에 비교 연산자 사용 불가
		...
} else if (dir.compareTo(Direction.WEST) > 0) { // compareTo() 는 가능
  • 열거형 상수의 동등 비교에 ==compareTo() 사용 가능
  • 비교 연산자 사용시 compareTo() 사용
  • compareTo() - (뺄셈이라고 생각하기)
    • 왼쪽이 크면 - 양수
    • 같으면 - 0
    • 오른쪽이 크면 - 음수

열거형의 조상 java.lang.Enum class

  • 모든 열거형은 Enum의 자손
  • 모든 열거형은 Enum class의 메서드들을 상속 받는다.
메서드설명
Class getDeclaringClass()열거형의 Class 객체를 반환
String name()열거형 상수의 이름을 문자열로 반환
int ordinal()열거형 상수가 정의된 수서를 반환 (0부터 시작)
T valueOf(Class enumType, String name)지정된 열거형에서 name 과 일치하는 열거형 상수를 반환
  • values(), valueOf() 는 컴파일러가 자동 추가
Direction[] dArr = Direction.values(); // 열거형의 모든 상수를 배열로 반환
for(Direction d : dArr)
	System.out.println("이름 : " + d.name() + ", 순서 : " + d.ordinal());

Direction d = Direction.valueOf("WEST");
// ==
Direction.WEST;

열거형에 멤버 추가

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 (생략)
}
  • 괄호 () 를 사용하려면, 인스턴스 변수와 생성자를 새로 추가한다.
  • 열거형 생성자는 묵시적으로 private 이므로, 외부에서 객체 생성 불가
profile
🧑🏻‍💻 Hello World!

0개의 댓글