본문 바로가기
Language/Java

[JAVA] enum 이란? (아무리 봐도 이해가 안 된다면 꼭 보자)

by jungwon3004 2022. 1. 20.
728x90
반응형

1. enum

enum은 사실 하나만 알면 된다.

"enum은 singleton의 일종이다."

사실상 설명 끝!!!

 

enum이라는 말은 Enumeration, 즉 "열거"의 약자이다.

Enumeration Type과 Enumeration constant(열거상수)로 이루어져있다.

사실 enum이 singleton의 일종이라는 것만 알고 코드를 보면 된다.

 

 

728x90

2. 사용법 (기본) & 원리

enum의 기본 사용법은 다음과 같다.

public enum Week{
	MON, TUE, WED, THUR, FRI, SAT, SUM
}

이걸 나중에 사용할 때는

Week.MON

이런 식으로 사용하면 된다.

사용법은 아주 아주 간단하다!!

 

Week.MON 은 값이 바뀌지도 않으며 외부에서 Week에 저 7개 외에 다른 값을 추가하려고 해도 추가가 안 된다.

이렇게만 보면 어떻게 enum이라는 타입이 존재하지? 어떻게 저런 특성을 가지지?라고 생각할 수도 있는데

이게 singleton이라는 걸 생각하면 굉장히 당연한 결과이다.

 

즉, enum의 elements들은 singleton이다!!

 

또한 Week.MON 같은 각각의 elements는 Week type의 public constant (public final static)이다.

외부에서 constructor를 통해 생성이 안 되는 것도 이 이유이며, 값이 고정이며 불변인 것도 같은 이유이다.

 

 

대충 이런식의 느낌으로 받아들이면 될 것이다.

public class Week{
private String week;
    
    public static Week MON = new Week("MON");
    public static Week TUE = new Week("TUE");
    ...
    
    private Week(String week){
     this.week = week;
    }
}

 

반응형

 

3. enum 응용1 (생성자, Constructor) 

public enum Food{
	
    BHC("BHC", "chicken", 18000), SAMYANG("SAMYANG", "ramen", 1000);
    
	private String name;
    private String category;
    private int price;
    
    private Food(String name, String category, int price){
    	this.name = name;
        this.category = category;
        this.price = price;
    }
	
    public void info(){
    	System.out.printf("%s %s 가격: %d%n", name, category, price);
        // 사용법 예시
        // Food.BHC.info();
    }
}

 enum도 class처럼 생성자를 만들 수 있다.

하지만 singleton이기 때문에 private로 만들어야 한다는 점만 기억해주면 된다.

 

 

 

4. 응용2 (abstract method)

public enum Food{
	
    BHC("BHC", "chicken", 18000){
    	@Override
        public void info(int num){
        	System.out.printf("%s를 %d개 시키면 %d원입니다.", name, num, num*price);
        }
    }, SAMYANG("SAMYANG", "ramen", 1000){
    	@Override
        public void info(int num){
        	System.out.printf("%s를 %d개 시키기엔 너무 비쌉니다.", name, num);
        }
    };
    // 사용법 예시
    // Food.BHC.info(5);
    
    
	private String name;
    private String category;
    private int price;
    
    private Food(String name, String category, int price){
    	this.name = name;
        this.category = category;
        this.price = price;
    }
	
    public abstract void info(int num);
}

이런 식으로 enum도 abstract method를 만들어 사용할 수 있다.

이때 람다를 활용해서 enum element를 생성할 때 구체화시킬 수 있다.

 

728x90
반응형