[Java] Enum (μ—΄κ±°ν˜•)

2021. 6. 20. 21:35γ†κ°œλ… 정리 μž‘μ—…μ‹€/Java

728x90
λ°˜μ‘ν˜•
Enumμ΄λž€?

컴퓨터 ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ—΄κ±°ν˜•(enumerated type, enumeration), μ΄λ„˜(enum), νŒ©ν„°(factor ← R ν”„λ‘œκ·Έλž˜λ° 언어와 ν†΅κ³„ν•™μ˜ λ²”μ£Όν˜• λ³€μˆ˜μ—μ„œ λΆ€λ₯΄λŠ” λͺ…μΉ­)λŠ” μš”μ†Œ, 멀버라 λΆˆλ¦¬λŠ” λͺ…λͺ…λœ κ°’μ˜ 집합을 μ΄λ£¨λŠ” μžλ£Œν˜•μΈ κ²ƒμ΄μ—μš”.

μ—΄κ±°μž 이름듀은 일반적으둜 ν•΄λ‹Ή μ–Έμ–΄μ˜ μƒμˆ˜ μ—­ν• μ„ ν•˜λŠ” μ‹λ³„μžμ΄μ§€μš”.

일뢀 μ—΄κ±°μž μžλ£Œν˜•μ€ 언어에 κΈ°λ³Έ μ†Œμ†λ˜μ–΄ μžˆμ„ 수 μžˆλŠ” κ²ƒμ΄μ—μš”. λΆˆλ¦¬μ–Έ μžλ£Œν˜•μ„ 예둜 λ“€λ©΄ 거짓(False)κ³Ό μ°Έ(True)의 값이 미리 μ •μ˜λœ μ—΄κ±°ν˜•μœΌλ‘œ λ³Ό 수 μžˆμ§€μš”. μˆ˜λ§Žμ€ μ–Έμ–΄λŠ” μ‚¬μš©μžλ“€μ΄ μƒˆλ‘œμš΄ μ—΄κ±°ν˜•μ„ μ •μ˜ν•  수 있게 ν•˜κ³  μžˆλ‹΅λ‹ˆλ‹€.

μ—΄κ±°ν˜•μ˜ κ°’κ³Ό λ³€μˆ˜λŠ” 일반적으둜 κ³ μ • 길이의 λΉ„νŠΈ λ¬Έμžμ—΄λ‘œ κ΅¬ν˜„λ˜λ©°, μ΄λŠ” 일뢀 μ •μˆ˜ν˜•κ³Ό ν˜Έν™˜λ˜λŠ” 포맷과 크기둜 λ˜μ–΄ μžˆλ‹΅λ‹ˆλ‹€. 특히 μ‹œμŠ€ν…œ ν”„λ‘œκ·Έλž˜λ° 언어와 같은 일뢀 언어듀은 μ‚¬μš©μžκ°€ 각각의 μ—΄κ±°μžλ₯Ό μœ„ν•΄ μ‚¬μš©ν•  λΉ„νŠΈ 결합을 지정할 수 있게 ν•˜λŠ” κ²ƒμ΄μ—μš”.

 

짧게 μ •λ¦¬ν•˜μžλ©΄ 'μ„œλ‘œ μ—°κ΄€λœ μƒμˆ˜λ“€μ˜ 집합'이라고 ν•  수 μžˆλ‹΅λ‹ˆλ‹€.

 

enum은 Class, Interface와 λ™κΈ‰μ˜ ν˜•μ‹μ„ κ°€μ§€λŠ” λ‹¨μœ„μΈ κ²ƒμ΄μ—μš”. ν•˜μ§€λ§Œ, enum은 사싀 Class라고 봐야 ν•œλ‹΅λ‹ˆλ‹€.

편의λ₯Ό μœ„ν•΄ enumλ§Œμ„ μœ„ν•œ 문법적 ν˜•μ‹μ„ κ°–κ³  있기 λ•Œλ¬Έμ— 이λ₯Ό κ΅¬λ³„ν•˜κΈ° μœ„ν•΄ enumμ΄λΌλŠ” Key Wordλ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμ΄μ—μš”. 

 

enum Fruit{
    APPLE, PEACH, BANANA;
}

enum Company{
    GOOGLE, APPLE, ORACLE;
}
 
public class ConstantDemo {
     
    public static void main(String[] args) {
        /*
        if(Fruit.APPLE == Company.APPLE){
            System.out.println("과일 μ• ν”Œκ³Ό νšŒμ‚¬ μ• ν”Œμ΄ κ°™λ‹€.");
        }
        */
        Fruit type = Fruit.APPLE;
        switch(type){
            case APPLE:
                System.out.println(57+" kcal");
                break;
            case PEACH:
                System.out.println(34+" kcal");
                break;
            case BANANA:
                System.out.println(93+" kcal");
                break;
        }
    }
}
 
enum Fruit{
    APPLE, PEACH, BANANA;
}

 

 

μœ„μ™€ μ•„λž˜ μ½”λ“œλŠ” 같은 λ‚΄μš©μΈ κ²ƒμ΄μ—μš”.

class Fruit{
    public static final Fruit APPLE  = new Fruit();
    public static final Fruit PEACH  = new Fruit();
    public static final Fruit BANANA = new Fruit();
    private Fruit(){}
}

 

κΈ°λ³Έ μƒμ„±μžμ˜ μ ‘κ·Ό μ œμ–΄μžκ°€ Private인 것이 λ³΄μ΄μ‹œλ‚˜μš”?

그것이 Class Fruitλ₯Ό μΈμŠ€ν„΄μŠ€λ‘œ λ§Œλ“€ 수 μ—†λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹΅λ‹ˆλ‹€. λ‹€λ₯Έ μš©λ„λ‘œ μ‚¬μš©ν•˜λŠ” 것을 κΈˆμ§€ν•˜λŠ” κ²ƒμ΄μ—μš”.

 

μ•„λž˜ μ½”λ“œλŠ” 컴파일 μ‹œ Exception이 λ°œμƒν•  κ²ƒμ΄μ—μš”.

if(Fruit.APPLE == Company.APPLE){
    System.out.println("과일 μ• ν”Œκ³Ό νšŒμ‚¬ μ• ν”Œμ΄ κ°™λ‹€.");
}

μ™œλƒν•˜λ©΄? enum이 μ„œλ‘œ λ‹€λ₯Έ μƒμˆ˜ Group에 λŒ€ν•œ 비ꡐλ₯Ό 컴파일 μ‹œμ μ—μ„œ μ°¨λ‹¨ν•˜κΈ° λ•Œλ¬ΈμΈ κ²ƒμ΄μ—μš”.

 

βœ” Enumκ³Ό μƒμ„±μž


enum은 사싀 Class인 κ²ƒμ΄μ—μš”. λ•Œλ¬Έμ— μƒμ„±μžλ₯Ό κ°€μ§ˆ 수 μžˆλ‹΅λ‹ˆλ‹€!

enum Fruit{
    APPLE, PEACH, BANANA;
    
    Fruit(){
        System.out.println( "Call Constructor " + this );
    }
}


// κ²°κ³Ό

Call Constructor APPLE
Call Constructor PEACH
Call Constructor BANANA
57 kcal

Call Constructorκ°€ 좜λ ₯된 것은 μƒμ„±μž Fruitκ°€ ν˜ΈμΆœλ˜μ—ˆμŒμ„ μ˜λ―Έν•˜λŠ” κ²ƒμ΄μ—μš”. 이것이 3번 ν˜ΈμΆœλ˜μ—ˆλ‹€λŠ” 것은?

ν•„λ“œ(μΈμŠ€ν„΄μŠ€ λ³€μˆ˜)의 숫자만큼 ν˜ΈμΆœλ˜μ—ˆλ‹€λŠ” μ˜λ―Έλžλ‹ˆλ‹€. λ”°λΌμ„œ enum은 μƒμ„±μžλ₯Ό κ°€μ§ˆ 수 μžˆλŠ” κ²ƒμ΄μ—μš”.

 

ν•˜μ§€λ§Œ, μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό λ³€κ²½ν•˜λ©΄ 컴파일 μ‹œ μ—λŸ¬κ°€ λ‚˜λŠ” κ²ƒμ΄μ—μš”.

enum Fruit{
    APPLE, PEACH, BANANA;
    
    public Fruit(){
        System.out.println( "Call Constructor " + this );
    }
}

이것은 enum의 μƒμ„±μžκ°€ μ ‘κ·Ό μ œμ–΄μž 'Privateλ§Œμ„ ν—ˆμš©' ν•˜κΈ° λ•Œλ¬Έμ΄λžλ‹ˆλ‹€.

κ·Έλž˜μ„œ Fruitλ₯Ό 직접 생성할 μˆ˜κ°€ μ—†λŠ” κ²ƒμ΄μ—μš”. κ·Έλ ‡λ‹€λ©΄ 이 μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(APPLE...)의 값을 λΆ€μ—¬ν•  수 μžˆλ‹€λŠ” 말인 κ²ƒμ΄μ—μš”.

 

enum Fruit{
    APPLE("red"), PEACH("pink"), BANANA("yellow");
    
    public String color;
    
    Fruit(String color){
        System.out.println( "Call Constructor " + this );
       
        this.color = color;
    }
}
 
public class ConstantDemo {
     
    public static void main(String[] args) {
 
        Fruit type = Fruit.APPLE;
        switch(type){
            case APPLE:
                System.out.println( 57 + " kcal, " + Fruit.APPLE.color );
                break;
            case PEACH:
                System.out.println( 34 + " kcal " + Fruit.PEACH.color );
                break;
            case BANANA:
                System.out.println( 93 + " kcal"+Fruit.BANANA.color );
                break;
        }
    }
}


/* μ‹€ν–‰ κ²°κ³Ό

Call Constructor APPLE
Call Constructor PEACH
Call Constructor BANANA
57 kcal, red

*/
 

 

 

μ•„λž˜ μ½”λ“œλŠ” Fruit 의 μƒμˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄μ„œλ„ λ™μ‹œμ— μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” κ²ƒμ΄μ—μš”.

APPLE("red"), PEACH("pink"), BANANA("yellow");

 

enum은 Methodλ₯Ό κ°€μ§ˆ 수 μžˆλ‹΅λ‹ˆλ‹€. μ•„λž˜ μ½”λ“œλŠ” 이전 μ˜ˆμ œμ™€ λ™μΌν•œ κ²°κ³Όλ₯Ό 좜λ ₯ν•˜λŠ” κ²ƒμ΄μ—μš”.

 

enum Fruit {
    APPLE("red"), PEACH("pink"), BANANA("yellow");
    
    private String color;
    
    Fruit( String color ) {
        System.out.println( "Call Constructor " + this );
        this.color = color;
    }
    
    String getColor(){
        return this.color;
    }
}
 
public class ConstantDemo {
     
    public static void main(String[] args) {
        Fruit type = Fruit.APPLE;
        switch(type){
            case APPLE:
                System.out.println(57+" kcal, "+Fruit.APPLE.getColor());
                break;
            case PEACH:
                System.out.println(34+" kcal"+Fruit.PEACH.getColor());
                break;
            case BANANA:
                System.out.println(93+" kcal"+Fruit.BANANA.getColor());
                break;
        }
    }
}

 

enum은 'Member 전체λ₯Ό μ—΄κ±° ν•  수 μžˆλŠ” κΈ°λŠ₯'도 μ œκ³΅ν•œλ‹΅λ‹ˆλ‹€.

 

public class ConstantDemo {
     
    public static void main(String[] args) {
        for(Fruit f : Fruit.values()){
            System.out.println( f + ", " + f.getColor() );
        }
    }
}

 

μ •λ¦¬ν•˜κ² μŠ΅λ‹ˆλ‹€!

μ—΄κ±°ν˜•μ€ 'μ—°κ΄€λœ 값듀을 μ €μž₯'ν•˜κ³ , κ·Έ 값듀이 λ³€κ²½λ˜μ§€ μ•Šλ„λ‘ 보μž₯ν•˜λŠ” κ²ƒμ΄μ—μš”. λ˜ν•œ, μ—΄κ±°ν˜• μžμ²΄κ°€ Class이기 λ•Œλ¬Έμ— μ—΄κ±°ν˜• 내뢀에 μƒμ„±μž, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, Methodλ₯Ό κ°€μ§ˆ 수 μžˆμ–΄ λ‹¨μˆœνžˆ μƒμˆ˜κ°€ μ•„λ‹ˆλΌ 더 λ§Žμ€ 역할을 ν•˜λŠ” μΉœκ΅¬λžλ‹ˆλ‹€!

 


λ³Έ λ‚΄μš©μ€ μ˜€ν”ˆλ“€ν† λ¦¬μ–Όμ¦ˆλ₯Ό κ³΅λΆ€ν•˜λ©°, μ •λ¦¬ν•˜μ˜€μŒμ„ μ•Œλ €λ“œλ¦½λ‹ˆλ‹€.

https://opentutorials.org/course/2517/14151

 

μ—΄κ±°ν˜•(enum) - ν”„λ‘œκ·Έλž˜λ° μž…λ¬Έ

enum은 μ—΄κ±°ν˜•(enumerated type)이라고 λΆ€λ₯Έλ‹€. μ—΄κ±°ν˜•μ€ μ„œλ‘œ μ—°κ΄€λœ μƒμˆ˜λ“€μ˜ 집합이라고 ν•  수 μžˆλ‹€.   package org.opentutorials.javatutorials.constant2; enum Fruit{     APPLE, PEACH, BANANA; } enum Company{     GOOGLE, AP

opentutorials.org

 

μΆ”κ°€ μ°Έκ³  자료

https://woowabros.github.io/tools/2017/07/10/java-enum-uses.html

 

Java Enum ν™œμš©κΈ° - μš°μ•„ν•œν˜•μ œλ“€ 기술 λΈ”λ‘œκ·Έ

μ•ˆλ…•ν•˜μ„Έμš”? μš°μ•„ν•œ ν˜•μ œλ“€μ—μ„œ 결제/μ •μ‚° μ‹œμŠ€ν…œμ„ κ°œλ°œν•˜κ³  μžˆλŠ” μ΄λ™μš±μž…λ‹ˆλ‹€.이번 사내 λΈ”λ‘œκ·Έ ν¬μŠ€νŒ… 주제둜 μ €λŠ” Java Enum ν™œμš© κ²½ν—˜μ„ μ„ νƒν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이전에 개인 λΈ”λ‘œκ·Έμ— Enum에 κ΄€ν•΄

woowabros.github.io


 

μ£Όλ‹ˆν•˜λž‘μ˜ 글이 λ§ˆμŒμ— λ“œμ…¨λ‚˜μš”? ꡬ독과 곡감! 그리고, λŒ“κΈ€μ€ μ£Όλ‹ˆν•˜λž‘μ—κ²Œ λ§Žμ€ 힘이 λ©λ‹ˆλ‹€!

 

 

728x90
λ°˜μ‘ν˜•