티스토리 뷰
Java에서는 상수를 선언하고 활용할때 다음과 같이 선언한다.
private static final String HELLO = "안녕";
그러나 여러 상수를 한번에 관리해주어야 하는 클래스가 생기기 마련이고,
또 상수가 많은 클래스는 가독성도 좋지 않고 또 상수 선언시마다 모든 키워드를 붙여주는 불편함,
그리고 변수명의 복잡해짐등 여러 문제점이 발생하게된다.
이때 사용하기 좋은것이 바로 JAVA에서 지원하는 Enum인 것이다.
enum은 열거형 타입으로 상수들을 묶어서 관리하고자 할때 사용하기 용이하다.
이 열거타입 클래스는 상수들만 다루기에 정말 최적화 되어있고
기본적으로 제공해주는 메소드들을 활용해 상수를 처리하고 다루는 부분에 있어 편리함과
가독성 모두를 챙겨갈수 있는 이점이 있다.
그럼 먼저 기본적으로 제공되는 메소드를 살펴보도록하겠다.
먼저 공식 문서를 보자면,
https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html
기본적으로 제공되는 메소드 몇개가 있지만 그중에서 활용도가 높은 메소드만 정리해보겠다.
메소드 | 기능 | 리턴 값 |
name() | 열거 객체의 문자열 자체를 리턴 | String |
ordinal() | 열거객체의 순번을 리턴 | int |
compareTo() | 열거 객체를 비교 후 순번차이를 리턴 | int |
valueOf() | 문자열을 입력받아 일치하는 열거 객체를 리턴 |
enum |
이때 공식문서에 숨어있는 메소드하나가 더 있다.
valueOf의 설명을 읽다보면 values()라는 메소드가 하나 언급되는데
이 녀석은 열거객체 배열을 리턴해주는 메소드로 반복문을 통해 활용하기 좋으니 꼭 기억해두자.
values() | 선언된 열거객체의 배열을 리턴 | enum[] |
그럼 실제 사용은 어떤식으로 진행되는지 한가지 예시를 들어 설명해보도록하겠다.
예시는 우아한 프리코스 4주차에서 진행됐던 크리스마스 프로모션을 예시로 들자면,
크리스마스 메뉴들에 대해 상수로 관리하는 상황을 가정해보자.
<애피타이저>
양송이수프(6,000), 타파스(5,500), 시저샐러드(8,000)
<메인>
티본스테이크(55,000), 바비큐립(54,000), 해산물파스타(35,000), 크리스마스파스타(25,000)
<디저트>
초코케이크(15,000), 아이스크림(5,000)
<음료>
제로콜라(3,000), 레드와인(60,000), 샴페인(25,000)
위와 같은 메뉴가 구성되어있고 이를 상수로 관리해주어야 하는 상황이라면,
enum을 사용하지 않는 경우
private static final TAPAS = "타파스"
private static final ZERO_COKE = "제로콜라"
private static final ICE_CREAM = "아이스크림"
....
위와같이 모든 키워드를 반복적으로 작성하고 상수들을 모두 상단에 선언해두고 사용해주어야 할것이다.
이를 enum을 활용해 열거형 타입으로 정의해주면,
다음과 같이 정리가 가능하겠다.
public enum FoodConstants {
SOUP,
TAPAS,
SALAD,
STEAK,
RIB,
SEAFOOD_PASTA,
CHRISTMAS_PASTA,
CAKE,
ICE_CREAM,
COKE,
WINE,
CHAMPAGNE;
}
현재는 단순히 변수명만으로 열거해서 표현해두었고
(상수는 대문자와 언더바를 사용해 작성하는것이 컨벤션이다.)
이제 메뉴이름과, 가격, 카테고리를 저장해주도록 하겠다.
private final String food;
private final int category;
private final int amount;
이를 생성자를 통해 열거형 객체에 저장해주면 된다.
private FoodConstants(final String food, final int category, final int amount) {
this.food = food;
this.category = category;
this.amount = amount;
}
그리고 각 값들에 대해 getter를 만들어 열거형 객체를 사용할때 원하는 값을 사용할수 있도록 한다.
public String getFood() {
return food;
}
public int getCategory() {
return category;
}
public int getAmount() {
return amount;
}
이제 이전에 변수명만 만들어 주었던 열거형 객체들에 대해 생성자에 맞게
메뉴이름, 가격, 카테고리를 넣어주도록 하겠다.
public enum FoodConstants {
SOUP("양송이수프", 0, 6000),
TAPAS("타파스", 0, 5500),
SALAD("시저샐러드", 0, 8000),
STEAK("티본스테이크", 1, 55000),
RIB("바비큐립", 1, 54000),
SEAFOOD_PASTA("해산물파스타", 1, 35000),
CHRISTMAS_PASTA("크리스마스파스타", 1, 25000),
CAKE("초코케이크", 2, 15000),
ICE_CREAM("아이스크림", 2, 5000),
COKE("제로콜라", 3, 3000),
WINE("레드와인", 3, 60000),
CHAMPAGNE("샴페인", 3, 25000);
...
}
이제 메뉴들에 대해서 메뉴이름, 카테고리, 가격 모두를 private static final 키워드의 사용없이
별도로 enum을 사용해 관리해줄수 있게 되었다.
이제 이 녀석을 조금 활용해보도록 하겠다.
메뉴 이름으로 현재 메뉴중에 존재하는 메뉴인가를 확인하는 기능을 만든다고 가정해보겠다.
그럼 현재 enum 객체를 한차례 순회하며 열거형 객체들의 메뉴이름들과 비교하는 로직으로 작성해본다면
이때 아까 위에서 한번 다루었던 기본 제공 메소드인 values()를 사용하면 된다.
private boolean contains(String food) {
return this.food.equals(food);
}
public static FoodConstants from(String food) {
for (FoodConstants foodConstants : FoodConstants.values()) {
if (foodConstants.contains(food)) {
return foodConstants;
}
}
throw InputException.createException(ORDER);
}
이 외에도 enum은 EnumSet, EnumMap등 컬렉션으로도 열거형 객체를 관리해줄수 있다.
물론 그냥 Set, Map으로도 관리하는것이 가능하지만 정의한 열거형 객체만 다루는게 가능하단 면에서
좀 더 불변성을 보장해주는 코드작성이 될것이므로 EnumSet, EnumMap을 적극 활용하는것이 권장된다.
'Java > 이론' 카테고리의 다른 글
일급컬렉션 (1) | 2023.11.26 |
---|---|
함수형 인터페이스 (JAVA) (0) | 2023.11.17 |
제네릭(Generic) (1) | 2023.10.04 |
연산자 (Operator) (0) | 2023.09.20 |
형 변환(casting) (0) | 2023.09.17 |