[Java 심화] Enum
Enum 열거형
서로 관련이 있는 것들만 모아서 번호를 매겨놓은 것,
서로 연관된 상수들의 집합이다
enum 열거형이름 { 상수명1, 상수명2 . . . }
상수명은 대소문자 다 작성가능하지만 관례적으로 대문자로 작성한다
열거하는 상수도 객체이기 때문에
enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}
위의 Day는 7개의 열거 객체로 구성된다
enum에 정의된 상수는 클래스의 static 변수를 참조하는 것과 동일한 방법으로 사용 가능하다
열거형이름.상수명
enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}
public class EnumExample {
public static void main(String[] args) {
System.out.println(Day.FRIDAY) ;
}
// Day.FRIDAY 는 Day 타입의 변수에 할당할 수 있다
enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}
public class EnumExample {
public static void main(String[] args) {
Day favoriteDay = Day.FRIDAY; // favoriteDay에 할당
System.out.println(favoriteDay); // FRIDAY 출력
System.out.println(Day.FRIDAY); // 똑같이 FRIDAY 출력
}
열거 타입은 몇 가지 한정된 값을 가지고 사용하는 데이터 타입인 이유로
경우를 나눠야할 때 많이 사용한다
public class EnumSwitch {
public static void main(String[] args) {
Day day = Day.MONDAY;
switch (day) {
case MONDAY:
System.out.println("월요일 싫어");
break;
case THURSDAY:
System.out.println("목요일은 치킨마요");
break;
case SATURDAY:
System.out.println("토요일 좋아");
break;
case SUNDAY:
System.out.println("일요일은 짜파게티");
break;
}
}
}
// day에 MONDAY를 할당한 상태인데 이 할당된 값으로 case를 나누고
// 이렇게 case로 나눔에 따라 콘솔에 출력되는 값이 달라진다
// 열거 타입이 7개로 한정된 값을 사용하는 데이터 타입이기 때문에
// 경우를 나눠야 할 때 위의 예시처럼 활용한다
Public static final과 enum
public static final을 통해서 전역변수를 상수로 설정해서 사용을 하는데
이게 상수명이 중복되는 일이 발생을 하게되면
컴파일 에러가 발생하게된다 (당연히 상수명이 중복되니까)
이 에러를 인터페이스를 사용해서 어느정도는 해결할 수 있긴하다
이유는, 인터페이스 내에 선언된 변수는 반드시 public static final로 선언, 상수화 하기 때문이다
그걸 인터페이스 별로 구분해놓으면 상수를 구분함으로써 어느정도는 해결할 수 있다
그러나,
타입 안정성에 문제가 생겨버리고 만다
static fianl 필드로만 가득 찬 인터페이스, 상수 인터페이스의 경우 메소드가 없기 때문에
아~~무런 의미도 없는 정보라서 이 값들을 가지고 뭘 하려고 해도 결국 의미가 없어져버린다
예를 들어 SPRING 이라는 상수가 인터페이스로 각각 구분돼서
interface Seasons {
int SPRING = 1
}
interface Seasons {
int SPRING = 2
}
이렇게 되어 있다고해도 이 상수 값들을
이걸 == 로 비교해본다 한들 무슨 의미가 있나 ?
그런데 웃기게도 저렇게 둘을 비교하게 되었을 때 에러가 발생하지 않는다
타입 안정성이 굉장히 떨어지는 예시라고 볼 수 있다
이 타입 비교 자체를 불가능하게 만들기 위해선 서로 다른 객체로 만들어야 한다
그렇다고 class를 나눠서 서로 다른 객체로 만들게 되면
new로 인스턴스를 만들 때마다 public static final을 붙여서 나타내야 하는데
코드가 아주 지저분해진다
또한 사용자 정의 타입이기 때문에 switch문에는 사용할 수 없다
(switch는 char, byte, short, int, String ... 또는 enum 이런 타입들만 가능하다)
이러한 문제를 enum으로 해결할 수 있는 것이다
enum으로 열거 객체를 만들면
상수명 중복은 물론이고 타입 안정성 문제, 가독성까지 해결하게 된다
그리고 switch 문에서도 사용이 가능하다