[자바/Java] 열거형(enum) 이란?
resilient
·2021. 1. 30. 00:45
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
'Language > Java & Kotlin' 카테고리의 다른 글
[자바/Java] I/O(Input/Output)이란? (0) | 2021.02.22 |
---|---|
[자바/Java] 애노테이션(annotation)이란? (0) | 2021.02.17 |
[자바/Java] 예외처리란? (0) | 2021.01.15 |
[자바/Java] 인터페이스(Interface)란? (0) | 2021.01.08 |
[자바/Java] 패키지(package) 란? (0) | 2021.01.05 |