열거체(enumeration type)
열거형 사용 배경
// 다른 범주에 속하는 상수를 정의할 때, 상수명이 중복되는 경우가 발생할 수 있다.
public static final int SPRING = 1;
public static final int SUMMER = 2;
public static final int DJANGO = 1;
public static final int SPRING = 2; // 계절의 SPRING과 중복
// 인터페이스를 사용하여 상수를 구분할 수 있지만,
interface Seasons {
int SPRING = 1, SUMMER = 2;
}
interface Frameworks {
int DJANGO = 1, SPRING = 2;
}
// 의미적으로 서로 비교할 수 없는 개념임에도 에러가 발생하지 않는 타입 안정성의 문제가 생김
if (Seasons.SPRING == Frameworks.SPRING) {...}
// 상수명 중복과 타입 안정성의 문제까지 해결되지만, 사용자 정의 타입이기 때문에 switch문에 사용할 수 없다.
class Seasons {
public static final Seasons SPRING = new Seasons();
public static final Seasons SUMMER = new Seasons();
}
class Frameworks {
public static final Frameworks DJANGO = new Frameworks();
public static final Frameworks SPRING = new Frameworks();
}
위처럼 여러 상수를 정의하여 사용할 경우, 문제를 해결하기 위한 방법으로 enum을 사용한다.
타입에 대한 안정성을 보장 받을 수 있고, 중복 상수명을 사용할 수 있으면서도, switch문에서도 사용할 수 있다.
switch의 조건으로는 'char, byte, short, int, Character, Byte, Short, Integer, String 또는 enum'타입만 가능하다.
switch문에서 enum 사용 예제
enum Seasons { // 자동적으로 0부터 시작하는 정수값이 할당됨
SPRING, // 정수값 0 할당
SUMMER // 정수값 1 할당
}
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;
}
}
}
//출력: 봄
열거형 사용 방법
관례적으로 대문자를 사용하고, 각각의 상수들에는 따로 값을 지정해주지 않아도 자동적으로 0부터 시작하는 정수값이 할당된다.
열거형에 선언된 상수에 접근하는 방법은 static 변수를 참조하는 것과 동일하게 열거형이름.상수명 을 통해서 가능하다.
열거형의 메소드
리턴 | 타입메소드(매개변수) | 설명 |
String | name() | 열거 객체가 가지고 있는 문자열을 리턴하며, 리턴되는 문자열은 열거타입을 정의할 때 사용한 상수 이름과 동일합니다. |
int | ordinal() | 열거 객체의 순번(0부터 시작)을 리턴합니다. |
int | compareTo(비교값) | 주어진 매개값과 비교해서 순번 차이를 리턴합니다. |
열거 타입 | valueOf(String name) | 주어진 문자열의 열거 객체를 리턴합니다. |
열거 배열 | values() | 모든 열거 객체들을 배열로 리턴합니다. |
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 each문으로 배열을 순회하며 정보를 x에 넘겨줌
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
중간 레벨
'Java > Effective' 카테고리의 다른 글
[Java Effective] 스레드(Thread) (0) | 2022.07.20 |
---|---|
[Java Effective] 스트림(Stream) (0) | 2022.07.19 |
[Java Effective] 람다식(Lambda Expression) (0) | 2022.07.18 |
[Java Effective] 애너테이션(Annotation) (0) | 2022.07.18 |