본문 바로가기

Java

JAVA enum vs static 비교

728x90
반응형

enum이란?

비단 자바에만 있는 개념은 아니고 다른 언어에서도 볼 수 있는 형식이다. 열거형이라 불리며 요소, 멤버라 명명된 값의 집합을 이루는 자료형으로 열거자 이름들은 해당언어의 상수 역할을 하는 식별자이다.

(출처 : 위키백과)


enum의 장점

  • 코드가 단순해지며 가독성이 좋다.
  • 인스턴스 생성, 상속을 방지하며 상수값의 타입 안전성이 보장된다.
  • enum이라는 키워드로 열거형의 의도를 명확히 드러낸다.

enum이 나온 배경

1. 코드에 주석이 없을 경우 코드를 이해하기 어려움

int type = 1;
if(type == 1) {
    System.out.println("boy");
} else {
    System.out.println("girl");
}

type에 대한 주석이나 if문 안에서 처리하는 내용에 대한 주석이 없으면 코드를 이해하기 어렵다.

 

2. 해결방안 >  final static을 설정한다.

private final static int BOY = 1;
private final static int GIRL = 2;

public static void main(String[] args) {

    int type = 1;
    if(type == BOY) {
        System.out.println("boy");
    } else if(type == GIRL){
        System.out.println("girl");
    }
}

final static으로 설정하면 주석없이도 의미를 파악할 수 있다.

 

private final static int BOY = 1;
private final static int GIRL = 2;

private final static int MONDAY = 1;
private final static int TUESDAY = 2;

그러나 같은 상수명을 갖는 다른의미의 값이 존재하거나 다른 상수명이지만 같은 값을 가지는 경우가 있을 수 있고 에러가 발생할 수 있다.

각각의 상수들은 자신을 인스턴스화 한 값을 할당한다.

BOY와 MONDAY는 서로 다른 데이터를 의미하는데 비교할 경우

if(BOY == MONDAY) {
...
}

컴파일 에러가 발생하지 않고 런타임 단계에서 생각지 못한 문제를 발생시킬 수 있다.

 

3. 해결방안 > class로 작성된 상수를 인스턴스화하여 구체화 한다.

class SEX {
    public final static SEX BOY = new SEX();
    public final static SEX GIRL = new SEX();
}

class DAY {
    public final static DAY MONDAY = new DAY();
    public final static DAY TUESDAY = new DAY();
}

인스턴스화하면 자신의 타입으로 비교하기 때문에 컴파일시 에러를 확인할 수 있다.

int type = 1;
switch (type) {
    case DAY.MONDAY:
        System.out.println("월요일");
        break;
    case DAY.TUESDAY:
        System.out.println("화요일");
        break;
}

그런데 switch문에 사용할 수 없다.

switch문을 사용할 수 있는 데이터 타입이 한정되어 있다. 

상수 사용시에는 switch문을 사용해야 가독성이 좋기 때문에 static을 사용하는 데 있어서 아쉬운 부분이다.

이러한 문제점을 해결하기 위해 enum이 나왔다.


Enum사용법

enum SEX {
    BOY(1), GIRL(2);

    private int sex;

    SEX(int type) {
        sex = type;
    }

    public int getSex() {
        return sex;
    }
}

enum DAY {
    MONDAY, TUESDAY
}

enum 클래스에 상수로 사용할 변수를 작성해준다.

BOY(1)처럼 값을 함께 지정해줄 수 있는데 생성자파라미터를 통해 필드에 값을 설정할 수 있다.

getter메소드를 이용하면 값을 가져다 쓸 수 있다.

SEX type = SEX.BOY;
switch (type) {
    case BOY:
        System.out.println("boy");
        break;
    case GIRL:
        System.out.println("girl");
        break;
}

 

사실 enum과 static을 선언한 constant는 목적이 다르다.

enum은 연관된 상수들을 묶어서 추상화 시킨 거고 constant는 값의 재할당을 막기 위한 목적에 맞다.

 

728x90
반응형