Java - Enum

eden6187·2021년 2월 16일
0

Java

목록 보기
1/4

Enum의 등장 배경

private final static int APPLE = 1;
private final static int PEACH = 2;
private final static int BANANA = 3;

private final static int GOOGLE = 1;
private final static int APPLE = 2;
private final static int ORANGE = 3;

interface를 이용한 상수 정의

interface Fruit{
   int APPLE = 1;
   int PEACH = 2;
   int BANANA = 3;
}

interface Company{
    int GOOGLE = 1;
    int APPLE = 2;
    int ORANGE = 3;
}

다음과 같이 interface를 문법적 특징 ( interface의 맴버는 기본적으로 public static final )을 이용하여 상수를 구분하여 정리 할 수 있지만 이렇게 하게 되면

if(Fruit.APPLE == Company.APPLE){
	someLogic();
}

위와 같은 경우에서 컴파일 에러가 발생하지 않는다. 문법적으로는 Fruit.APPLE과 Company.APPLE을 비교하는 것이 가능하기 때문이다. 하지만 논리적으로 생각해본다면 이러한 비교는 옳지 않다. 이러한 논리적인 에러는 런타임에 돌려봐야만 알 수 있기 때문이다.

클래스를 이용하여 상수 정의

class Company{
    public static final Company APPLE = new Company();
    public static final Company GOOGLE = new Company();
    public static final Company ORACLE = new Company();
}

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

if(Fruit.APPLE == Company.APPLE){
	someLogic();
}

위와같은 방법을 이용하면 논리적인 오류를 컴파일 타임에 확인 할 수 있게 된다!

하지만 이러한 방법은 switch문에서는 쓸 수가 없다....

Enum

기본적인 사용 방법

enum Fruit{
     APPLE, PEACH, BANANA
}

Fruit type = Fruit.APPLE

switch(type){
    case APPLE:
    	someLogic();
        break;
    case BANANA:
    	someLogic();
        break;
    case PEACH:
    	someLogic();
        break;
}

enum이라는 것은 사실상 Class이다.

문법적 특징

enum Fruit{
     APPLE("red"), PEACH("pink"), BANANA("yellow")
     // 1. enum에서 생성자를 call 하는 방식
     // 2. APPLE PEACH BANANA는 각각 다른 Instance
     
     private int color;
     
     public String getColor(){
         return this.color;
     }// 3. 클래스와 같이 메소드를 정의 할 수도 있다.
     
     Fruit(int color){
     	// 4. 클래스와 같이 생성자를 가질 수 있다.
     	System.out.println("Call Constructor" + this);
        this.color = color;
     }
}

Class로 상수를 선언할 때와는 달리 .values()를 이용해 열거가 가능하다.

for(Fruit f : Fruit.values()){
    someLogics();
}

정리

  1. 연관된 값들(상수)들을 저장한다.
  2. 그 자체가 클래스이기 때문에 member, method등을 가질 수 있다.
  3. 열거 가능 ( enumeration )

참조

https://www.youtube.com/watch?v=vFDsVdaZeao&list=PL_xKLSp5T58uRhl94cQcbEKdpuM8p-V5k&index=140

0개의 댓글

관련 채용 정보