Enum

송민지·2024년 9월 25일

이번 팀 프로젝트를 진행하면서 Java의 enum Types를 사용하여 클라이언트에 값을 보내주었습니다. 이번 포스트는 enum에 대해 정리한 글 입니다.

Enum

  • enum은 Java뿐만아니라 C/C++, TypeScript, Python등 다양한 언어에서 지원하는 지원합니다.
  • enum은 미리 정의된 상수들의 특별한 집합입니다. enum의 영어 뜻 역시 enumeration, 열거라는 뜻 입니다.
  • java에서 가장 확실하게 멀티스레드 환경에서 immutable을 보장하는 싱글톤 인스턴스로서 가장 많이 사용하는 방법 중 하나 입니다.

Enum의 장점

  1. Type Safety
  • enum은 컴파일 타임에 타입 안정성을 보장합니다. 특정 범위의 값만 사용 가능하므로 컴파일 에러를 먼저 보여주어 런타임 예외를 줄일 수 있습니다.
  1. Readability
  • enum은 의도적으로 가독성을 높일 수 있습니다. 값들이 명시적으로 정의되어 있기 때문에 코드를 읽을 때 쉽게 이해할 수 있습니다.
  1. enum은 관리가 용이합니다. 값이 추가되거나 변경되는 경우, 한 곳에서만 변경하면 되기 때문에 코드의 유지 보수가 용이합니다.

  2. Performance: 상수니까

  • enum은 컴파일 타임에 정적인 값으로 변환되기 때문에, 실행 시간에서 상수 검색의 오버헤드를 줄입니다.
  1. 문자열과 비교해, IDE의 적극적인 지원을 받을 수 있습니다.

  2. 직렬화: 싱글톤 보장

  • enum 타입은 기본적으로 직렬화 가능하므로 Serializable 인터페이스를 구현할 필요가 없고, 리플렉션 문제도 발생하지 않습니다.
  • 인스턴스가 JVM 내에 하나만 존재한다는 것이 100% 보장 되므로, Java에서 싱글톤을 만드는 가장 좋은 방법으로 권장됩니다.
  1. 키워드 enum을 사용하기 때문에 구현 의도가 열거임을 분명하게 나타낼 수 있습니다.

사용방법

enum 사용시 예시

오라클 공식문서 Enum Types의 예시입니다.

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY 
}
public class EnumTest {
    Day day;
    
    public EnumTest(Day day) {
        this.day = day;
    }
    
    public void tellItLikeItIs() {
        switch (day) {
            case MONDAY:
                System.out.println("Mondays are bad.");
                break;
                    
            case FRIDAY:
                System.out.println("Fridays are better.");
                break;
                         
            case SATURDAY: case SUNDAY:
                System.out.println("Weekends are best.");
                break;
                        
            default:
                System.out.println("Midweek days are so-so.");
                break;
        }
    }
    
    public static void main(String[] args) {
        EnumTest firstDay = new EnumTest(Day.MONDAY);
        firstDay.tellItLikeItIs();
        EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
        thirdDay.tellItLikeItIs();
        EnumTest fifthDay = new EnumTest(Day.FRIDAY);
        fifthDay.tellItLikeItIs();
        EnumTest sixthDay = new EnumTest(Day.SATURDAY);
        sixthDay.tellItLikeItIs();
        EnumTest seventhDay = new EnumTest(Day.SUNDAY);
        seventhDay.tellItLikeItIs();
    }
}

enum 미사용 예시

public class EnumTest{
	private fianl static int MONDAY = 1;
    private fianl static int TUESDAY = 2;
    private fianl static int WEDNSDAY = 1;
    private fianl static int THURSDAY = 1;
    private fianl static int FRIDAY = 1;
    private fianl static int SATUREDAY = 1;
    private fianl static int SUNDAY = 1;
    
    public static void main(String[] args){
    
    	int day = MONDAY;
        
        switch(day){
        case MONDAY:
        		System.out.println("월요일 입니다.")
         case TUESDAY:
        		System.out.println("화요일 입니다.")
          case WEDNSDAY:
        		System.out.println("수요일 입니다.")
                
                /*
                 * 생략합니다.
                 */
                 
        }
    }
}

두 코드를 비교해보면

  1. 첫번째 코드가 더 가독성이 높습니다.
  2. 두번째 코드는 값이 수정되면 하드코딩된 값을 수정해야 되지만, 첫 번째 코드는 enum값만 수정해주면 됩니다.

결론

  1. 기본적으로 enum은 type-safety하다.
  2. 어디선가 잘못된게 있을 때 바로바로 런타임에러 뜨기 전 컴파일러 차원에서 체크가 가능하다.
  3. 개발자 입장에서는 코드 가독성이 좋아진다.

[Java] enum은 왜 쓰는걸까? (feat. 우아한형제들 기술블로그)
The Java™ Tutorials
[Java] Enum을 사용하는 이유와 활용법
JAVA:enum의 뿌리를 찾아서...

profile
항상 밝게

0개의 댓글