728x90
Enum을 정의하는 방법
Enum이란?
enum 열거형은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 상수를 여러 개 정의할 때 사용합니다. enum은 여러 상수를 정의한 후, 정의된 것 이외의 값은 허용하지 않는다는 특징이 있습니다. 또한 자바의 열거형은 C언어와는 달리 타입까지 비교가 가능하다고 합니다.
public enum Dir {
UP, DOWN, LEFT, RIGHT
}
열거형은 위와 같이 작성할 수 있습니다.
@Getter
@Setter
public class EnumExample {
public enum Dir {
UP, DOWN, LEFT, RIGHT
}
private int x;
private int y;
public void move(Dir dir){
switch (dir){
case UP :
setY(getY()+1);
break;
case DOWN:
setY(getY()-1);
break;
case LEFT:
setX(getX()-1);
break;
case RIGHT:
setX(getX()+1);
break;
}
}
}
switch - case문을 써서 활용해본 예제입니다.
열거형 값에 접근하는 방법은 간단합니다.
System.out.println(DIR.UP);
생성자 추가 가능
자바의 enum은 클래스이므로 생성자 추가가 가능합니다.
enum Dir {
UP, DOWN, LEFT, RIGHT;
Dir() {
System.out.println("생성자");
}
}
또한 메서드도 추가가 가능합니다.
enum에서 제공하는 메서드
메서드 | 설명 |
T[] values() | 해당 enum 타입에 정의된 상수 배열 반환 |
Class<E> getDeclaringClass() | 열거형의 객체 반환 |
String name() | 열거형 상수의 이름 반환 |
int ordinal() | 열거형 상수가 정의된 순서 반환 |
T valueOf(Class<T> enumType, String name) | 지정된 열거형에서 name과 일치하는 열거형 상수 반환 |
java.lang.Enum
enum 클래스들은 java.lang.Enum 클래스의 자손입니다.
package java.lang;
import java.io.Serializable;
import java.io.IOException;
import java.io.InvalidObjectException;
import java.io.ObjectInputStream;
import java.io.ObjectStreamException;
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
private final String name;
public final String name() { return name; }
private final int ordinal;
public final int ordinal() { return ordinal; }
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
public String toString() { return name; }
public final boolean equals(Object other) {return this==other;}
public final int hashCode() { return super.hashCode();}
protected final Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
public final int compareTo(E o) {
Enum<?> other = (Enum<?>)o;
Enum<E> self = this;
if (self.getClass() != other.getClass() && // optimization
self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
}
@SuppressWarnings("unchecked")
public final Class<E> getDeclaringClass() {
Class<?> clazz = getClass();
Class<?> zuper = clazz.getSuperclass();
return (zuper == Enum.class) ? (Class<E>)clazz : (Class<E>)zuper;
}
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) {
T result = enumType.enumConstantDirectory().get(name);
if (result != null)
return result;
if (name == null)
throw new NullPointerException("Name is null");
throw new IllegalArgumentException(
"No enum constant " + enumType.getCanonicalName() + "." + name);
}
protected final void finalize() { }
private void readObject(ObjectInputStream in) throws IOException,
ClassNotFoundException {
throw new InvalidObjectException("can't deserialize enum");
}
private void readObjectNoData() throws ObjectStreamException {
throw new InvalidObjectException("can't deserialize enum");
}
}
Enum 클래스 소스 코드를 가져왔습니다. 위에서 언급하지 않은 다른 메서드들이 더 있군요.
EnumSet
열거형을 위한 Set 구현체입니다. EnumSet의 모든 요소는 집합이 생성될 때 명시적으로 또는 암시적으로 지정된 단일 열거형에서 가져와야 합니다. EnumSet은 비트연산을 이용해 메모리 공간도 적게 차지하고 속도도 빠릅니다. 또한 HashSet과 달리 버킷을 찾기 위해 해시 코드를 계산할 필요가 없다는 장점이 있습니다.
EnumSet 메서드
메서드 | 설명 |
EnumSet clone() | 복제본을 반환합니다. |
static > EnumSet allOf(Class elementType) | enum에 포함된 모든 정보를 담아서 EnumSet을 만듭니다. |
static > EnumSet complementOf(EnumSet s) | 지정한 열거형 집합과 동일한 요소 유형을 가진 열거형 집합 만듭니다. |
static > EnumSet copyOf(Collection c) | 지정한 컬렉션에서 초기화된 열거형 집합을 만듭니다. |
static > EnumSet of(E e) | 지정한 요소가 포함된 열거형 집합을 만듭니다. |
static > EnumSet range(E from, E to) | from ~ to 범위의 모든 요소를 포함하는 열거형 집합을 만듭니다. |
EnumSet의 특이점은 new 키워드를 통한 생성이 불가능합니다. abstract 클래스라서 객체 생성이 불가능하다고 합니다.
출처
https://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html
자바의 정석
728x90
'Java' 카테고리의 다른 글
추상클래스의 객체 생성 (0) | 2023.10.29 |
---|---|
[Java] 어노테이션 정리 (0) | 2021.06.22 |
[JAVA] 멀티쓰레드 프로그래밍 (0) | 2021.06.02 |
[Java] 예외처리 (0) | 2021.05.18 |
[Java] 인터페이스에 대하여 (0) | 2021.05.10 |