enum 정의하는 방법
1. 상수명만 있는 경우 (상수명 마지막 세미콜론 생략가능)
enum 이름 {
상수명1, 상수명2, 상수명3...
}
public class Main {
public static void main(String[] args) {
System.out.println(Language.JAVA);
}
enum Language {
JAVA, CSHARP
}
}
내부 바이트 코드
public final enum com/practice/Language extends java/lang/Enum {
// compiled from: Language.java
// access flags 0x4019
public final static enum Lcom/practice/Language; JAVA
// access flags 0x4019
public final static enum Lcom/practice/Language; CSHARP
// access flags 0x101A
private final static synthetic [Lcom/practice/Language; $VALUES
// access flags 0x9
public static values()[Lcom/practice/Language;
L0
LINENUMBER 3 L0
GETSTATIC com/practice/Language.$VALUES : [Lcom/practice/Language;
INVOKEVIRTUAL [Lcom/practice/Language;.clone ()Ljava/lang/Object;
CHECKCAST [Lcom/practice/Language;
ARETURN
MAXSTACK = 1
MAXLOCALS = 0
// access flags 0x9
public static valueOf(Ljava/lang/String;)Lcom/practice/Language;
L0
LINENUMBER 3 L0
LDC Lcom/practice/Language;.class
ALOAD 0
INVOKESTATIC java/lang/Enum.valueOf (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
CHECKCAST com/practice/Language
ARETURN
L1
LOCALVARIABLE name Ljava/lang/String; L0 L1 0
MAXSTACK = 2
MAXLOCALS = 1
// access flags 0x2
// signature ()V
// declaration: void <init>()
private <init>(Ljava/lang/String;I)V
L0
LINENUMBER 3 L0
ALOAD 0
ALOAD 1
ILOAD 2
INVOKESPECIAL java/lang/Enum.<init> (Ljava/lang/String;I)V
RETURN
L1
LOCALVARIABLE this Lcom/practice/Language; L0 L1 0
MAXSTACK = 3
MAXLOCALS = 3
// access flags 0x8
static <clinit>()V
L0
LINENUMBER 4 L0
NEW com/practice/Language
DUP
LDC "JAVA"
ICONST_0
INVOKESPECIAL com/practice/Language.<init> (Ljava/lang/String;I)V
PUTSTATIC com/practice/Language.JAVA : Lcom/practice/Language;
NEW com/practice/Language
DUP
LDC "CSHARP"
ICONST_1
INVOKESPECIAL com/practice/Language.<init> (Ljava/lang/String;I)V
PUTSTATIC com/practice/Language.CSHARP : Lcom/practice/Language;
L1
LINENUMBER 3 L1
ICONST_2
ANEWARRAY com/practice/Language
DUP
ICONST_0
GETSTATIC com/practice/Language.JAVA : Lcom/practice/Language;
AASTORE
DUP
ICONST_1
GETSTATIC com/practice/Language.CSHARP : Lcom/practice/Language;
AASTORE
PUTSTATIC com/practice/Language.$VALUES : [Lcom/practice/Language;
RETURN
MAXSTACK = 4
MAXLOCALS = 0
}
toString
선언에 포함된 열거형 상수 이름을 반환
public class Main {
public static void main(String[] args) {
System.out.println(Language.PYTHON);
}
enum Language {
JAVA {
@Override
public String toString() {
return "Java";
}
},
C {
@Override
public String toString() {
return "C";
}
},
PYTHON {
@Override
public String toString() {
return "파이썬";
}
};
}
}
값을 갖는 열거형
enum enum이름 {
상수명1(상수값1, 상수값2..), 상수명2(상수값1, 상수값2..)... ;
private final 자료형 value;
private final 자료형 value2;
private enum명 (자료형 value, ....) {
this.value = value;
....
}
}
enum 내에서 getter 메서드 사용가능
Q. Enum은 java.lang.String의 subclass인가?
A. 틀림. 모든 enum은 암시적으로 java.lang,Enum을 상속 받음
docs.oracle.com/javase/tutorial/java/javaOO/QandE/enum-answers.html
enum이 제공하는 메서드
name() | 열거 선언한 열거 상수의 이름을 반환 |
ordinal() | 열거 상수의 해당 위치, 초기값은 0부터 시작 |
toString() | |
valueOf(String args) | String 값을 enum에서 가져온다 |
valueOf(Class<T> enumType, String name) | 특정 enum type과 이름으로 enum을 리턴한다. |
values | enum의 요소들을 순서대로 가져온다 |
valueOf
public class Main {
public static void main(String[] args) {
System.out.println(Enum.valueOf(Language.class, "JAVA"));
System.out.println(Language.valueOf("JAVA"));
}
enum Language {
JAVA {
@Override
public String toString() {
return "Java";
}
},
C {
@Override
public String toString() {
return "C";
}
},
PYTHON {
@Override
public String toString() {
return "파이썬";
}
};
}
}
values
public class Main {
public static void main(String[] args) {
for (Language language : Language.values()) {
System.out.println(language);
}
}
enum Language {
JAVA {
@Override
public String toString() {
return "Java";
}
},
C {
@Override
public String toString() {
return "C";
}
},
PYTHON {
@Override
public String toString() {
return "파이썬";
}
};
}
}
java.lang.Enum
docs.oracle.com/javase/7/docs/api/java/lang/Enum.html
Enum은 java.lang.Enum을 상속해서 사용.
public abstract class Enum<E extends Enum<E>>extends Object
implements Comparable<E>, Serializable
생성자가 protected인 단일 생성자
주요 메소드
- clone()
- compareteTo()
- equals()
- finalize() : enum class가 finalize 메서드를 갖지 못하게함
- getDeclaringClass() : enum 상수에 해당하는 Class Object를 리턴한다
- hashCode()
- name()
- ordinal()
- toString()
- valueOf(Class<T> enumType, String name)
enumset
docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html
enum type Set 인터페이스이다. AbstractSet를 상속받고 Java Set 인터페이스를 구현한다.
EnumSet 상속구조
java.lang.Object
↳ java.util.AbstractCollection<E>
↳ java.util.AbstractSet<E>
↳ java.util.EnumSet<E>
EnumSet의 장점
산술 비트 연산을 사용하여 구현되기때문에 기본작업이 매우 빠름
메모리를 적게 사용
EnumSet은 추상 클래스. JDK가 제공하는정적 팩토리 메서드를 통해서 인스턴스화를 한다.
RegularEnumSet
long을 사용해 EnumSet에 값을 담는다. Enum을 나타내는 64 비트 길이를 담을 수 있다.
JumboEnumSet
64 비트 길이를 초과하면 JumboEnumSet으로 인스턴스화 한다.
public enum Language {
JAVA, CSHARP, RUBY
}
주요 메서드
- allOf ( 열거형 Enum Set을 만듦)
public class Main {
public static void main(String[] args) {
EnumSet<Language> languages = EnumSet.allOf(Language.class);
System.out.println(languages); // JAVA, CSHARP, RUBY
}
}
- noneOf( 빈 열거형 Enum Set을 만듦)
public class Main {
public static void main(String[] args) {
EnumSet<Language> languages = EnumSet.noneOf(Language.class);
System.out.println(languages); // []
}
}
- add (Enum 상수값을 추가)
public class Main {
public static void main(String[] args) {
EnumSet<Language> languages = EnumSet.noneOf(Language.class);
languages.add(Language.JAVA);
System.out.println(languages); // [JAVA]
}
}
- range( 열거형에 나열된 하위집합을 모두 가져옴)
public class Main {
public static void main(String[] args) {
EnumSet<Language> set = EnumSet.range(Language.JAVA, Language.RUBY);
System.out.println(set); // [JAVA, CSHARP, RUBY]
}
}
- complementOf (매개변수로 전달된 enum 상수값을 제외)
public class Main {
public static void main(String[] args) {
EnumSet<Language> languages = EnumSet.complementOf(EnumSet.of(Language.RUBY));
System.out.println(languages); // [JAVA, CSHARP]
}
}
참고 :
빵형의 실전 JAVA
www.geeksforgeeks.org/enumset-class-java/