최근 프로젝트를 진행하다가 "이건 Enum으로 빼서 처리하면 좋을 것 같은데요?"라는 조언을 들었다. Enum을 자바 공부하면서 들어보긴 했는데 어떠한 점이 좋은지, 어떻게 쓰면 되는지에 대해서는 명확하게 잘 알지는 못하기에 오늘은 Java의 Enum에 대해서 알아보고자 한다.
Enum
Enum은 Enumeration의 약자로 열거, 목록의 뜻을 가지고 있으며 "상수의 데이터 집합"이라고 생각하면 된다.
일반적으로 상수를 정의하는 방법은 여러 가지가 존재하는데 이는 다음과 같다.
- final 상수
변수를 final 제어자를 이용해 변수를 상수화 한다. 동시에 static을 사용하여 메모리에 한 번만 할당 되게 설정한다는 장점을 가지지만 접근 제어자들 때문에 가독성이 좋지 못하다는 단점이 있다.
private final static int MONDAY = 1;
private final static int TUESDAY = 2;
private final static int WEDNESDAY = 3;
private final static int THURSDAY = 4;
private final static int FRIDAY = 5;
private final static int SATURDAY = 6;
private final static int SUNDAY = 7;
- 인터페이스 상수
interface을 이용하여 상수를 선언하는 방법이다. 코드를 간결하게 작성할 수 있지만, 다른 집합에 정의된 상수끼리 서로 비교하는 로직이 가능하거나, 잘못된 상수가 할당되었음에도 결국은 정수값이기 때문에 컴파일 에러 없이 실행된다는 점에서 문제가 발생한다는 단점을 가지고 있다.
interface DAY {
int MONDAY = 1;
int TUESDAY = 2;
int WEDNESDAY = 3;
int THURSDAY = 4;
int FRIDAY = 5;
int SATURDAY = 6;
int SUNDAY = 7;
}
- 자체 클래스 상수
상수를 정수값으로 구성하는 것이 아닌 객체로 선언하여 상수를 사용하는 방법이다. 가독성과 switch문에서는 사용이 불가능하다는 단점을 가지고 있다.
class Day {
// 자기 자신 객체를 인스턴스화 하고 final static 화 함으로써 고유의 객체 상수를 얻게 됨
public final static Day MONDAY = new Day();
public final static Day TUESDAY = new Day();
public final static Day WEDNESDAY = new Day();
}
class Month {
public final static Month JANUARY = new Month();
public final static Month FEBRUARY = new Month();
public final static Month MARCH = new Month();
}
- Enum 상수
이런 위의 문제를 해결하기 위해 자바에서는 상수만을 다루는 enum 타입 클래스를 만들었다.
enum Day{
MONDAY,TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
enum Month{
JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY,
AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER;
}
사용 방법
열거 타입을 나타내기 위해서, 마치 배열처럼 나열하여 표현하면 된다. enum명은 클래스와 마찬가지로 파스칼케이스를 따르면 되고, 열거 상수는 모두 대문자로 작성한다. 열거 상수가 여러 단어로 구성될 경우 언더바 (예 : _ )을 이용하여 단어 사이를 연결한다.
- 카멜케이스 : 단어 연결 시 첫 문자를 제외한 나머지 단어 첫 문자를 대문자로 표시하는 기법 (예 : myVariableName, calculateDiscountAmount)
- 파스칼케이스 : 단어 연결 시 단어마다 첫 문자를 대문자로 표시하는 기법 (예 : MyClass, CalculateDiscountAmount)
enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
enum LoginResult {
LOGIN_SUCCESS,
LOGIN_FAILED
}
Enum 타입의 객체도 하나의 데이터 타입이므로 사용할 때 변수를 선언하고 사용하면 된다.
Week monday = Week.MONDAY;
Week sunday = Week.SUNDAY;
Enum 타입은 특수한 클래스인데, String처럼 스택 영역에 있는 변수들이 힙 영역에 있는 데이터의 주소값을 저장함으로써 참조 형태를 띠게 된다. 따라서 enum 타입 변수끼리 같은 상수 데이터를 바라봄으로써 둘이 비교하는 == 연산 결과는 true가 된다.
Week monday = Week.MONDAY;
Week m = Week.MONDAY;
if(monday == m){
System.out.println("Hello World!");
}
=======================================
Hello World!
'Programing Language > Java' 카테고리의 다른 글
Lambda Expression (0) | 2024.06.05 |
---|---|
Optional (0) | 2024.05.24 |
Stream (0) | 2024.05.09 |
Thread (수정중) (1) | 2024.05.01 |
String 객체 (0) | 2024.04.30 |