본문 바로가기
JAVA

enum

by e-pd 2021. 1. 25.

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

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

 

Answers to Questions and Exercises: Enum Types (The Java™ Tutorials > Learning the Java Language > Classes and Obj

Home Page > Learning the Java Language > Classes and Objects The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer

docs.oracle.com

 


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 Platform SE 7 )

Returns the enum constant of the specified enum type with the specified name. The name must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.) Note that for a particular enum typ

docs.oracle.com

 

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

 

EnumSet (Java Platform SE 7 )

A specialized Set implementation for use with enum types. All of the elements in an enum set must come from a single enum type that is specified, explicitly or implicitly, when the set is created. Enum sets are represented internally as bit vectors. This r

docs.oracle.com

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/

www.baeldung.com/java-enumset

 

'JAVA' 카테고리의 다른 글

I/O  (0) 2021.02.15
애노테이션  (0) 2021.02.05
멀티쓰레드 프로그래밍  (0) 2021.01.16
예외처리  (0) 2021.01.10
인터페이스  (0) 2021.01.03