Java Enum 사용기

WinG·2024년 3월 9일
0

Java

목록 보기
1/2
post-thumbnail

Java Enum

Enum은 "Enumeration"의 약자로 열거, 목록, 일람표 라는 뜻을 가지고 있다.
어렵게 생각할 필요 없이 상수 데이터들의 집합이라 생각하면 된다.

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;
}

JAVA의 enum은 인터페이스와 같이 독립된 특수한 클래스로 구분한다. 즉, 일종의 객체이기 때문에 힙(heap) 메모리에 저장되며 각 enum 상수들은 별개의 메모리 주소값을 가짐으로써 완벽히 독립된 상수를 구성할 수 있는 것이다.


우테코 3주차 미션을 보면 Java Enum을 적용하라는 요구사항이 있다. Enum을 사용하면 무엇이 좋길래, 적극적으로 enum 사용을 요구하는 것일까? 한번 알아보자!

Enum의 장점

1. 데이터들의 연관 관계 표현

몇 개의 번호가 일치하였는지, 그리고 상금 금액이 얼마인지는 결국 궁극적으로 순위와 관련이 있다. 각각의 메소드를 구현하여도 기능상으로는 문제가 없으나, '6개 번호가 일치한다는 사실', '2000000000원이라는 당첨 금액'이 모두 최종적으로 '1등' 이라는 같은 의미라는 것을 직관적으로 알 수 없다. 또한 너무 많은 반복성 코드가 발생하게 될 가능성이 높다.
그래서 위의 부분을 Enum으로 추출해보면, 아래와 같이 한 묶음이 된 것을 코드로 바로 확인할 수 있다.

public enum Rank {
    MISS(0, 0, ""),
    FIFTH(3, 5_000, "3개 일치 (5,000원) - "),
    FOURTH(4, 50_000, "4개 일치 (50,000원) - "),
    THIRD(5, 1_500_000, "5개 일치 (1,500,000원) - "),
    SECOND(5, 30_000_000, "5개 일치, 보너스 볼 일치 (30,000,000원) - "),
    FIRST(6, 2_000_000_000, "6개 일치 (2,000,000,000원) - ");

    private int countOfMatch;
    private int winningMoney;
    private String message;
    private Rank(int countOfMatch, int winningMoney, String message) {
        this.countOfMatch = countOfMatch;
        this.winningMoney = winningMoney;
        this.message = message;
    }
}

또한 추가 타입이 필요한 경우에도 Enum 상수와 get메소드만 추가하면 되며, 이를 사용하는 곳에서도 깔끔하게 표현이 가능하다.

2. 상태와 행위를 한 곳에서 관리

Enum을 활용하지 않으면, Rank는 Rank대로 조회하고 이에 관련된 행위는 별도의 클래스와 메소드를 통해 진행해야한다. 하지만 enum을 활용하면 어떨까? 3주차 우테코 미션을 리팩토링 하면서 이를 적용해보았다.

물론 위의 코드는, 상태를 변경시키는 코드는 아니다. (적절한 예시가 아니라는 것도 알지만,,, 직접 구현한 코드 중 마땅한 예시가 없었다😓) 하지만 Rank를 조회하지 않고 Enum에서 메소드를 구현하여 한 곳에서 행위를 처리할 수 있음을 보여주고자 하였다.
실제로 사용하는 곳에서도 아래 사진처럼 직접 Rank에 행위를 수행하도록 요청하면 된다.

이처럼 코드내에 전부 표현되어 있고, Enum 상수에게 직접 물어보면 되기 때문에 값(상태)과 메소드(행위)가 어떤 관계가 있는지에 대해 더이상 다른 곳을 찾을 필요가 없게 된다.

3. 데이터의 그룹관리

순위라는 데이터는 조건상금으로 표현된다. 예를 들어 3개라는 일치하는 번호의 갯수는 해당 순위를 얻기 위한 조건이며, 5000원은 해당 순위를 얻음으로써 받을 수 있는 상금을 의미한다.
미션에서는 로또를 발행했을 때, 나의 순위가 몇 등이며, 얼만큼의 수익률을 내었는지 출력해야하는 조건이 존재한다. 물론 이를 구현하는 가장 쉬운 방법은 if문과 반복문을 돌면서 구현하는 것이다. 하지만 이를 Enum으로 전환해보면 어떨까?

Java의 Enum은 결국 클래스인 점을 이용하여, Enum의 상수에 해당 순위를 얻기 위한 조건, 상금 금액 그리고 출력 문자열을 갖도록 하였다.
위로 올라가서 다시 caculateRanking 메소드를 확인해보자.
각 Enum 상수들은 본인들이 갖고 있는 조건들을 확인하여 어느 일치하는 로또 번호의 갯수가 어느 Enum 상수에 포함되어있는지 확인할 수 있게 되었다.

또한 이를 바탕으로 출력 문자열을 더욱 간단하게 코드로 표현할 수 있다.


[참고 자료]
https://techblog.woowahan.com/2527/

profile
공부하는 감자😎

0개의 댓글