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는 값의 재할당을 막기 위한 목적에 맞다.
'Java' 카테고리의 다른 글
DTO로 변환할 때 PropertyNamingStrategy 사용 snake->camel 변환 (0) | 2022.03.30 |
---|---|
JAVA GC가 발생하는 시기(Garbage Collector) (0) | 2022.02.10 |
JAVA 직렬화란? 직렬화 사용이유 (0) | 2022.02.02 |
java static 사용이유 생성자 대신 static 팩토리 메소드 (0) | 2021.12.18 |
JAVA Optional (0) | 2021.02.03 |