[자바/Java] 열거형(enum) 이란?

resilient

·

2021. 1. 30. 00:45

728x90
반응형

github.com/whiteship/live-study/issues/11

 

11주차 과제: Enum · Issue #11 · whiteship/live-study

목표 자바의 열거형에 대해 학습하세요. 학습할 것 (필수) enum 정의하는 방법 enum이 제공하는 메소드 (values()와 valueOf()) java.lang.Enum EnumSet 마감일시 2021년 1월 30일 토요일 오후 1시까지.

github.com

목표

자바의 열거형에 대해 학습하세요.

학습할 것 (필수)

  • enum 정의하는 방법
  • enum이 제공하는 메소드 (values()와 valueOf())
  • java.lang.Enum
  • EnumSet

마감일시

2021년 1월 30일 토요일 오후 1시까지.


#enum이란??

 

enum은 '열거형'을 의미한다.

enum은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용하다.

원래 자바는 열거형이 존재하지 않았지만 JDK1.5부터 추가되었다. 자바의 열거형은 열거형이 갖는 값뿐만 아니라 타입도 관리하기 때문에 논리적인 오류를 줄일 수 있다.

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}
	enum Value {TWO, THREE, FOUR}
	
	final Kind kind;
	final Value value;
}

 

# enum 정의하는 방법

 

enum을 정의하는 방법은 괄호 {}안에 상수의 이름을 나열하기만 하면 된다.

enum Kind {CLOVER, HEART, DIAMOND, SPADE}
enum Value {TWO, THREE, FOUR}
	

enum 상수간의 비교에는 '=='을 사용할 수 있다. equals()가 아닌 '=='로 비교가 가능하다는 것은 그만큼 빠른 성능을 제공한다는 얘기다. 그러나 비교연산자는 사용할 수없고, compareTo()는 사용가능하다. compareTo()는 두비교대상이 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수를 반환한다.

 

# java.lang.Enum 이란?

enum Direction{ EAST, SOUTH, WEST, NORTH}
 
Direction [] dArr = Direction.values();

for(Direction d : dArr) {
	System.out.println("%s = %d%n", d.name(),d.ordinal());
}

 

모든 enum의 조상이다.

java.lang.Enum에는 ordinal()이라는 메소드도 있고 열거형 상수가 정의된 순서(0부터시작한다)를 정수로 반환해준다.

 

 

# enum이 제공하는 메소드 (values()와 valueOf())

 

values()는 enum의 모든 상수를 배열에 담아서 반환한다. 이 메소드는 모든 enum이 가지고 있는 것으로, 컴파일러가 자동으로 추가해준다. 

values()말고도 컴파일러가 자동적으로 추가해주는 메소드가 하나 더 있다.

static E values()
static E valueOf(String name)

valuesOf()메소드는 enum 상수의 이름으로 문자열 상수에 대한 참조를 얻을 수 있게 해준다.

 

enum을 직접 정의 하고 사용해보는 코드

enum Direction { EAST, SOUTH, WEST, NORTH }

class EnumEx1 {
	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) {
			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;
		}

		Direction[] dArr = Direction.values();

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

 

# EnumSet 이란?

 

EnumSet 은 java.util.AbstractSet -java.util.EnumSet 패키지 에 있는 클래스이다.

enum형으로 사용하기 위한 특수학 Set 구현이다. 

내부적으로 bit vector로 표현하기 때문에 매우 효율적이다.

( bit vector,비트 벡터란 중복되지 않는 정수 집합을 비트로 나타내는 방식이다.)

EnumSet 클래스를 구현할 때 공간/시간 퍼포먼스는 비트 플래그의 대안으로 사용할 수 있을 정도로 고수준이여야한다.

이렇게 사용하면 된다.

EnumSet<Planet> planets = EnumSet.of(Planet.NEPTUNE, Planet.EARTH);
EnumSet<Planet> all = EnumSet.allOf(Planet.class);
EnumSet<Planet> none = EnumSet.noneOf(Planet.class);
EnumSet<Planet> inner = EnumSet.range(Planet.MERCURY, Planet.EARTH);

 

 

# Reference

반응형