[JAVA] enum type

Aug 13, 2019 22:05 · 597 words · 2 minute read java enum singleton

  • 열거 자료형

기존의 java 에서 상수를 사용할 때 아래와 같이 정의한다.

//과일
public static int F_APPLE = 1;
public static int F_MANGO = 2;
public static int F_MELON = 3;

//의류
public static int C_ZARA = 1;
public static int C_MANGO = 2;
public static int C_SPAO = 3;

위의 코드에서 2와 비교를 할 때 과일과 의류의 MANGO 는 따로 정의 되어 있지만 비교시에 둘 다 2로써 값이 같다고 여기게 된다. 과일 타입을 받는 메서드가 있다고 할 때, 의류 변수를 넣어도 동작하게 될 것이다. 이런 경우 enum을 사용하여 구분을 쉽게 할 수 있다. 아래 처럼 enum을 사용하여 열거 할 수 있다.

public enum Fruits {APPLE, MANGO, MELON}
public enum Clothes {ZARA, MANGO, SPAO}

이것은 실제로 아래의 코드와 동일하다

public class Fruits {
public static int APPLE = new Fruits();
public static int MANGO = new Fruits();
public static int MELON = new Fruits();
}

앞에서부터 0, 1, 2 의 값을 가진다.

enum은 생성자가 private로 외부에서 인스턴스화를 할 수가 없다. 내부에서 생성자를 사용하는 방식

public enum Fruits {
    APPLE(1000);
    MANGO(2000);
    MELON(3000);

    final private int number;

    private Fruits(int number){
    this.number = number;
    }
}

getter 메서드를 생성하여 해당 내용을 가져올 수 있다.

enum은 클래스처럼 사용하기에 내부에 상수열거 뿐 아니라 일반 변수 및 메서드를 사용할 수 있다.

enum 의 singleton pattern

public enum Sample {
INSTANCE;

int NUMBER_MAX = 100;
int NUMBER_MIN = 10;
}

처음 코드를 보았을 때 이해가 되지 않았다. enum 클래스 안의 떡하니 있는 INSTANCE. 위의 enum type 인 것이다. APPLE, MANGO 처럼 사실은 아래 코드와 같다.

public enum Sample {
public static int INSTANCE = new Sample();
}

하나의 인스턴스만을 사용하는 싱글톤패턴을 잘 보여주고 있다. 외부 클래스 등에서

int nMax = Sample.INSTANCE.getInt("NUMBER_MAX");

로 사용 할 수 있다. 물론 getInt 메서드는 따로 enum 클래스 내부에 만들어 두어야 한다.

자료형 타입에 따라 다른 getDouble, getInt, get(배열 등) 등으로 만들어두면 여러타입의 상수가 있을 때 용의하다.