Live-Study

[11μ£Όμ°¨] Enum

youn12 2021. 2. 19. 16:14
✏️ Info.

- Java Enum ν•™μŠ΅

πŸ“‹ List.

1. Enum μ •μ˜
2. Enum이 μ œκ³΅ν•˜λŠ” λ©”μ†Œλ“œ (values()와 valueOf()) + ordinal()(μΆ”κ°€)
3. java.lang.Enum


βœ”οΈ Content.

 

1. Enum μ •μ˜

 

1). Enum μ΄λž€

 

  • 멀버라 λΆˆλ¦¬λŠ” λͺ…λͺ…λœ κ°’μ˜ 집합을 μ΄λ£¨λŠ” μžλ£Œν˜•
  • μ—΄κ±°ν˜•(enumerated type)이라 λΆ€λ₯Έλ‹€.
  • μ„œλ£Œ μ—°κ΄€λœ μƒμˆ˜λ“€μ˜ 집합
  • Java 1.5λΆ€ν„° μ‚¬μš© κ°€λŠ₯
  • 열거체λ₯Ό 비ꡐ할 λ•Œ μ‹€μ œ κ°’ λΏλ§Œμ•„λ‹ˆλΌ νƒ€μž…κΉŒμ§€λ„ μ²΄ν¬ν•œλ‹€.
  • μ—΄κ±°μ²΄μ˜ μƒμˆ˜κ°’μ΄ μž¬μ •μ˜λ˜λ”λΌλ„ 재 μ»΄νŒŒμΌν•  ν•„μš”κ°€ μ—†λ‹€.

2). Enum μ •μ˜

 

  • enum 열거체λͺ…{μƒμˆ˜1이름, μƒμˆ˜2이름, ...}
public enum customEnum {
    RED, BLUE, ORANGE, YELLOW
}

 

3). Enum μ‚¬μš©

void useEunm(){
        customEnum red = customEnum.RED;
        System.out.println(red);
    }

 

좜λ ₯

RED

 

4). Enum의 μƒμˆ˜κ°’ μ •μ˜ 및 μΆ”κ°€

 

  • μ—΄κ±°μ²΄μ˜ 첫 번째 μƒμˆ«κ°’μ€ 0λΆ€ν„° μ„€μ •λ˜λ©°, κ·Έλ‹€μŒμ€ λ°”λ‘œ μ•žμ˜ μƒμˆ«κ°’λ³΄λ‹€ 1만큼 μ¦κ°€λ˜λ©° μ„€μ •λœλ‹€.
  • λΆˆκ·œμΉ™ν•œ 값을 μƒμˆ˜κ°’μœΌλ‘œ μ„€μ •ν•˜κ³  μ‹ΆμœΌλ©΄ μƒμˆ˜μ˜ 이름 μ˜†μ— κ΄„ν˜Έ()λ₯Ό μΆ”κ°€ν•˜κ³ , κ΄„ν˜Έ μ•ˆμ— μ›ν•˜λŠ” μƒμˆ˜κ°’μ„ λͺ…μ‹œν•  수 μžˆλ‹€.
    • μ΄λ•Œ λΆˆκ·œμΉ™ν•œ νŠΉμ •ν•œ 값을 μ €μž₯ν•  수 μžˆλŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ μƒμ„±μžλ₯Ό λ³„λ„λ‘œ μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.
public enum customEnum {
    RED(1), BLUE(2), ORANGE(5), YELLOW(6);

    int val;

    customEnum(int val) {
        this.val = val;
    }
}

 

5). Enum (val) μ‚¬μš©

void useEunm(){
        customEnum red = customEnum.RED;
        System.out.println(red);
        System.out.println(red.val);
    }

 

좜λ ₯

RED
1

 

2. Enum이 μ œκ³΅ν•˜λŠ” λ©”μ†Œλ“œ (values()와 valueOf()) + ordinal()(μΆ”κ°€)

 

1). values()

  • ν•΄λ‹Ή μ—΄κ±°μ²΄μ˜ λͺ¨λ“  μƒμˆ˜λ₯Ό μ €μž₯ν•œ 배열을 μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ” λ©”μ†Œλ“œ
  • μžλ°”μ˜ λͺ¨λ“  열거체에 μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μΆ”κ°€ν•΄μ€€λ‹€.
// Enum
public enum customEnum {
    RED(1), BLUE(2), ORANGE(5), YELLOW(6);

    int val;

    customEnum(int val) {
        this.val = val;
    }
}

// values()
void valuesEnum(){
        customEnum[] values = customEnum.values();
        for (customEnum value : values) {
            System.out.println(value);
        }
    }

 

좜λ ₯

RED
BLUE
ORANGE
YELLOW

 

2). valueOf()

 

  • μ „λ‹¬λœ λ¬Έμžμ—΄κ³Ό μΌμΉ˜ν•˜λŠ” ν•΄λ‹Ή μ—΄κ±°μ²΄μ˜ μƒμˆ˜λ₯Ό λ°˜ν™˜
//Enum
public enum customEnum {
    RED(1), BLUE(2), ORANGE(5), YELLOW(6);

    int val;

    customEnum(int val) {
        this.val = val;
    }
}

//valueOf()
void valueOfEnum(){
        customEnum yellow = customEnum.valueOf("YELLOW");
        System.out.println(yellow);
    }

 

좜λ ₯

YELLOW

 

3). ordinal()

 

  • 열거체 μƒμˆ˜κ°€ 열거체 μ •μ˜μ—μ„œ μ •μ˜λœ μˆœμ„œ(0λΆ€ν„° μ‹œμž‘)λ₯Ό λ°˜ν™˜
  • λ°˜ν™˜λ˜λŠ” 값은 열거체 μ •μ˜μ—μ„œ ν•΄λ‹Ή 열거체 μƒμˆ˜κ°€ μ •μ˜λœ μˆœμ„œμ΄λ©°, μƒμˆ˜κ°’ μžμ²΄κ°€ μ•„λ‹ˆλ‹€.
//Enum
public enum customEnum {
    RED(1), BLUE(2), ORANGE(5), YELLOW(6);

    int val;

    customEnum(int val) {
        this.val = val;
    }
}

//ordinal()
void ordinalEnum(){
        int ordinal = customEnum.YELLOW.ordinal();
        System.out.println(ordinal);
    }

 

좜λ ₯

3

 

3. java.lang.Enum

 

  • Enum ν΄λž˜μŠ€λŠ” λͺ¨λ“  μžλ°” μ—΄κ±°μ²΄μ˜ κ³΅ν†΅λœ 쑰상 ν΄λž˜μŠ€μ΄λ‹€.
    • λ”°λΌμ„œ JavaλŠ” 닀쀑 상속을 μ§€μ›ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— Enum은 λ‹€λ₯Έ 클래슀λ₯Ό 상속받을 수 μ—†λ‹€.
  • Enum ν΄λž˜μŠ€μ—λŠ” 열거체λ₯Ό μ‘°μž‘ν•˜κΈ° μœ„ν•œ λ‹€μ–‘ν•œ λ©”μ†Œλ“œλ“€μ΄ μžˆλ‹€.
  • μ—΄κ±°ν˜• μƒμˆ˜ κ°„μ˜ λΉ„κ΅μ—λŠ” ==와 compareTo() μ‚¬μš© κ°€λŠ₯ν•˜λ‹€
    • 비ꡐ μ—°μ‚°μžλŠ” μ‚¬μš© λΆˆκ°€
  • 주둜 μ‚¬μš©λ˜λŠ” λ©”μ†Œλ“œ

 

λ©”μ†Œλ“œ μ„€λͺ…
static E values() ν•΄λ‹Ή μ—΄κ±°μ²΄μ˜ λͺ¨λ“  μƒμˆ˜λ₯Ό μ €μž₯ν•œ 배열을 μƒμ„±ν•˜μ—¬ λ°˜ν™˜
static E valueOf(String name) μ „λ‹¬λœ λ¬Έμžμ—΄κ³Ό μΌμΉ˜ν•˜λŠ” ν•΄λ‹Ή μ—΄κ±°μ²΄μ˜ μƒμˆ˜λ₯Ό λ°˜ν™˜
String name() ν•΄λ‹Ή 열거체 μƒμˆ˜μ˜ 이름을 λ°˜ν™˜
int ordinal() ν•΄λ‹Ή 열거체 μƒμˆ˜κ°€ 열거체 μ •μ˜μ—μ„œ μ •μ˜λœ μˆœμ„œ(0λΆ€ν„° μ‹œμž‘)을 λ°˜ν™˜

 

4. EnumSet

 

1).EnumSet

  • Set μΈν„°νŽ˜μ΄μŠ€ 기반으둜 μ—΄κ±°ν˜• νƒ€μž…μœΌλ‘œ 지정
  • java.util νŒ¨ν‚€μ§€ 클래슀
  • λΉ„νŠΈ 연산을 μ΄μš©ν•΄ λ©”λͺ¨λ¦¬ 곡간도 적게 μ°¨μ§€ν•˜κ³  속도도 λΉ λ₯΄λ‹€.
  • new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œ 생성 λΆˆκ°€λŠ₯

주의점

 

  • μƒμ„±μž μ˜€λ²„ 라이딩 λΆˆκ°€λŠ₯
  • λ™μΌν•œ νƒ€μž…μ˜ μ—΄κ±° μƒμˆ˜λ§Œ μ„ μ–Έ κ°€λŠ₯
  • null값을 λ„£κ±°λ‚˜ NullPointException을 던질 수 μ—†λ‹€.
  • μŠ€λ ˆλ“œλ‘œλΆ€ν„° μ•ˆμ „ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ ν•„μš”ν•œ 경우 μ™ΈλΆ€μ—μ„œ 동기화
  • μƒμˆ˜λŠ” μ—΄κ±° ν˜•μ— μ„ μ–Έλœ μˆœμ„œμ— 따라 μ €μž₯ (ordinal)

λ©”μ„œλ“œ

λ©”μ„œλ“œ μ„€λͺ…
allof(Class<E> elementType) λͺ¨λ“  μƒμˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” EnumSet 생성
clone() 볡사본 생성
complementOf(EnumSet<E> s) νŠΉμ • μƒμˆ˜λ₯Ό μ œμ™Έν•˜κ³  EnumSet 생성
copyOf(Collection<E> c)
copyOf(EnumSet<E> s)
Collections을 μ‚¬μš©ν•œ 볡사본 생성
noneOf(Class<E> elementType) 빈 EnumSet 생성
of(E e)
of(E first, E... rest)
of(E e1, E e2)
of(E e1, E e2, E e3)
of(E e1, E e2, E e3, E e4)
of(E e1, E e2, E e3, E e4, E e5)
νŠΉμ • μƒμˆ˜λ₯Ό ν¬ν•¨ν•œ EnumSet 생성
range(E form, E to) νŠΉμ • λ²”μœ„(μƒμˆ˜)λ₯Ό κ°€μ§€λŠ” EnumSet 생성

 

//Enum
public enum customEnum {
    RED(1, "λΉ¨κ°•"), BLUE(2, "νŒŒλž‘"), ORANGE(5, "μ£Όν™©"), YELLOW(6, "λ…Έλž‘");

    int val;
    String name;

    customEnum() {
        this.val = val;
    }

    customEnum(int val, String name) {
        this.val = val;
        this.name = name;
    }
}

// SetEnum Method()
void setEnum(){
        /* 전체 μƒμˆ˜κ°€ μžˆλŠ” Enum Set 생성 */
        EnumSet<customEnum> allOf = EnumSet.allOf(customEnum.class);
        System.out.println("EnumSet.allOf => " + allOf);

        /* 볡사본 생성 */
        EnumSet<customEnum> clone = allOf.clone();
        System.out.println("clone => " + clone);

        /* EnumSet을 μ΄μš©ν•œ 볡사본 생성 */
        EnumSet<customEnum> copyOf = EnumSet.copyOf(allOf);
        System.out.println("copyOf => " + copyOf);

        /* νŠΉμ • μƒμˆ˜λ§Œ 생성 */
        EnumSet<customEnum> enumOf = EnumSet.of(customEnum.BLUE, customEnum.RED);
        System.out.println("EnumSet.of => " + enumOf);

        /* νŠΉμ • μƒμˆ˜ μ œμ™Έν•˜κ³  생성 */
        EnumSet<customEnum> complementOf = EnumSet.complementOf(enumOf);
        System.out.println("EnumSet.complementOf = > " + complementOf);

        /* 빈 Enum Set 생성 */
        EnumSet<customEnum> noneOf = EnumSet.noneOf(customEnum.class);
        System.out.println("EnumSet.noneOf => " + noneOf);

        /* νŠΉμ • λ²”μœ„ 생성*/
        EnumSet<customEnum> range = EnumSet.range(customEnum.BLUE, customEnum.YELLOW);
        System.out.println("EnumSet.range => " + range);
    }

 

좜λ ₯

 

EnumSet.allOf => [RED, BLUE, ORANGE, YELLOW]
clone => [RED, BLUE, ORANGE, YELLOW]
copyOf => [RED, BLUE, ORANGE, YELLOW]
EnumSet.of => [RED, BLUE]
EnumSet.complementOf = > [ORANGE, YELLOW]
EnumSet.noneOf => []
EnumSet.range => [BLUE, ORANGE, YELLOW]

❗️ Refer.

- enum μ •μ˜ν•˜λŠ” 방법
https://ko.wikipedia.org/wiki/%EC%97%B4%EA%B1%B0%ED%98%95
https://opentutorials.org/course/2517/14151

- enum이 μ œκ³΅ν•˜λŠ” λ©”μ†Œλ“œ (values()와 valueOf())
http://www.tcpschool.com/java/java_api_enum

- java.lang.Enum

http://www.tcpschool.com/java/java_api_enum

- EnumSet
https://wisdom-and-record.tistory.com/52
https://velog.io/@kwj1270/Enum
https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html