본문 바로가기
두고두고 볼 것

enum

by 문자메일 2022. 3. 21.

단순한 열거형

값을 갖는 열거형

2개 이상 값을 갖는 열거형

메서드를 갖는 열거형

 

 

Enum을 사용하는 이유?

int 자료형으로 조건 비교하여 사용할 때 발생할 수 있는 다양한 실수를 방지하는 효과를 가지기 위해서이다.

 

 

사례1. int 자료형에 값 넣어서 비교할 경우

발생 가능할 문제점(실수) :

색의 조건 상수와, 대중교통의 조건 상수처럼 서로 다른 속성의 상수를 비교하는 생각지도 못한 실수가 발생할 수 있다.

-> 하지만 Compile, runtime 과정에서 에러 발생하지 않는다. 그래서 잘못된 방법으로 사용한 걸 알아차리기 힘들다.

-> BIKE와 RED는 서로 다른 속성의 조건 상수 값 이지만, 초기화 된 값은 1로 같아서 동등 비교 연산 시 True가 된다.

void enumTest(){
    // enum을 사용하는 이유는 결과적으로 string 변수로 조건을 비교하여 사용할 때 일어날 수 있는 다양한 실수를 방지하는 효과를 가지기 위해서이다
    // 색 집합
    final int RED = 1;
    final int BLUE = 2;
    final int GREEN = 3;

    //대중교통 집합
    final int BIKE = 1;
    final int SUBWAY = 2;
    final int BUS = 3;


    int inputColor = RED;

    System.out.println(inputColor == RED ? "RED" : "Not Red");
    // 물리적으로 값 비교 결과가 True로 나오는 것은 맞으나, 설계(생성) 의도에서 생각했을 때 둘의 속성의 의미는 다르므로 논리적으로 True가 나오면 안 된다.
    System.out.println(inputColor == BIKE ? "Red" : "Not Red");
}

 

 

 

사례 1에서 발생한 문제 : int 자료형으로 비교하면 의도치 않은 실수가(휴먼 에러) 발생 할 수 있다.

개선방안 : 각 속성값을 나타내는 클래스를 만들고, 속성 상수에 int 대신 instance 주소값을 넣어서 비교에 활용한다.

단점 : 각 속성값들의 클래스를 사용자들이 직접 만들어야 한다.

void enumTest2(){
    // 숫자 값으로 비교하면 위의 사례에서 나왔던 논리적인 에러가 발생할 수 있으니, 각 속성의 값을 나타내는 class를 만들고
    // 각 속성 변수에 서로다른 인스턴스의 주소값을 넣어서 비교하는 것에 활용한다.
    // but 문제는 객체를 비교하기 위해서 class를 직접 만들어야 한다는 번거로움이 있다.
    final Color RED = Color.RED;
    final Color BLUE = Color.BLUE;
    final Color ORANGE = Color.ORANGE;

    final Transportation BIKE = Transportation.BIKE;
    final Transportation BUS = Transportation.BUS;
    final Transportation SUBWAY = Transportation.SUBWAY;


    Color inputColor = RED;

    System.out.println(inputColor == RED ? "RED" : "Not Red");
    System.out.println(inputColor.equals(Color.RED) ? "RED" : "Not Red");
    // class, instance 값이 다르므로 Compile 에러가 발생한다.
    //System.out.println(inputColor == SMALL ? "Red" : "Not Red");
    System.out.println(inputColor.equals(Transportation.BIKE) ? "Red" : "Not Red");
}
class Color{
    public final static Color RED = new Color();
    public final static Color BLUE = new Color();
    public final static Color ORANGE = new Color();
}

class Transportation{
    public final static Transportation BIKE = new Transportation();
    public final static Transportation BUS = new Transportation();
    public final static Transportation SUBWAY = new Transportation();
}

# ==와 equals()의 차이점 https://go-coding.tistory.com/35

 

 

 

사례 2에서 발생한 문제 : 각 속성값들의 클래스를 사용자들이 직접 만들어야 한다.

개선 : Enum 사용 (사례1, 사례2 문제 해결 위해 만들어진 것)

장점 : 간결하게 사용이 가능하다.

        Enum 클래스에서 정의하지 않은 값을 Enum 상수에 초기화 하려고 하면 컴파일 에러 발생 (휴먼 에러 방지)

       

void enumTest3(){
    Color1 RED = Color1.RED;
    Color1 BLUE = Color1.BLUE;
    Color1 ORANGE = Color1.ORANGE;
    //Error
    //Color1 ORANGE = Color1.asda;

    Transportation1 BIKE = Transportation1.BIKE;
    Transportation1 BUS = Transportation1.BUS;
    Transportation1 SUBWAY = Transportation1.SUBWAY;
    //Error
    //Transportation1 SUBWAY = Transportation1.AIRPLANE;

    Color1 input = Color1.RED;

    System.out.println(input.equals(Color1.RED) ? "Red" : "Not Red");
    System.out.println(input.equals(Transportation1.BIKE) ? "Red" : "Not Red");
}
// class 생성 방식과 비교하면 instance 생성 부분이 간략해졌음
enum Color1{
    RED, BLUE, ORANGE
}

enum Transportation1{
    BIKE, BUS, SUBWAY
}

 

댓글