📘 Backend/Java
Java Enum
신건우
2023. 4. 1. 11:20
📘 Enum (열거형)
- 서로 연관된 상수들의 집합 (상수 = final 키워드를 통한 변하지 않는 값 선언)
- 상수명은 대문자로 하는것이 관례
- 상수 하나하나는 객체로 간주함
- 따로 값을 지정해주지 않으면 0부터 시작하는 int형 값 자동할당
기본 형식
- enum 열거형이름 {상수명1, 상수명2 ...}
- enum Seasons {SPRING, SUMMER, FALL, WINTER}
- JDK1.5 이전버전에서는 Enum을 지원하지 않아 아래와 같은 전역변수를 상수로 선언하는 방식을 사용했다.
public static final int SPRING = 1;
public static final int SUMMER = 2;
public static final int FALL = 3;
public static final int WINTER = 4;
public static final int DJANGO = 1;
public static final int SPRING = 2; // 계절의 SPRING과 중복 발생!
public static final int NEST = 3;
public static final int EXPRESS = 4;
위와 같이 상수를 선언하고, 상수명이 중복이 되면 컴파일 에러가 발생함
interface Seasons {
int SPRING = 1, SUMMER = 2, FALL = 3, WINTER = 4;
}
interface Frameworks {
int DJANGO = 1, SPRING = 2, NEST = 3, EXPRESS = 4;
}
1차적인 해결법으로 위와 같이 인터페이스를 사용하여 상수구분을 함으로써 해결이 가능하지만,
타입 안정성이라는 새로운 문제가 생김
이외에도, 객체 생성을 통한 방법 외 여러가지가 있지만 switch문에 활용할 수 없는 등 여러 문제가 있다.
(switch 문은 사용자정의 타입이 호환이 안됨)
Enum을 활용한 상수 정의
enum Seasons { SPRING, SUMMER, FALL, WINTER }
enum Frameworks { DJANGO, SPRING, NEST, EXPRESS }
위와 같이 enum을 활용해 코드작성을 하면 앞선 문제들의 해결과 코드의 간결을 동시에 챙길수 있다
또한, switch문에서도 활용이 가능하다
switch문을 활용한 enum의 상수 정의
enum Seasons {SPRING, SUMMER, FALL, WINTER}
public class Main {
public static void main(String[] args) {
Seasons seasons = Seasons.SPRING;
switch (seasons) {
case SPRING:
System.out.println("봄");
break;
case SUMMER:
System.out.println("여름");
break;
case FALL:
System.out.println("가을");
break;
case WINTER:
System.out.println("겨울");
break;
}
}
}
//출력값
봄
Enum에서 사용할 수 있는 Method
enum Level {
LOW, // 0
MEDIUM, // 1
HIGH // 2
}
public class EnumTest {
public static void main(String[] args) {
Level level = Level.MEDIUM;
Level[] allLevels = Level.values();
for(Level x : allLevels) {
System.out.printf("%s=%d%n", x.name(), x.ordinal());
}
Level findLevel = Level.valueOf("LOW");
System.out.println(findLevel);
System.out.println(Level.LOW == Level.valueOf("LOW"));
switch(level) {
case LOW:
System.out.println("낮은 레벨");
break;
case MEDIUM:
System.out.println("중간 레벨");
break;
case HIGH:
System.out.println("높은 레벨");
break;
}
}
}
//출력값
LOW=0
MEDIUM=1
HIGH=2
LOW
true
중간 레벨
위의 코드에서
values() = level에 정의된 모든 상수를 배열로 반환함
name() , ordinal() = values로 받은 배열의 각각 이름과 순서를 출력값으로 반환
valueOf() = 지정된 열거형에서 이름과 일치하는 열거형의 상수를 반환
ordinal = 객체의 순번(인덱스 번호) 리턴
Java에서 열거형은 상수명의 중복,타입의 안정성, 보다 편리한 상수선언을 보장하며 switch문에서 동작가능