본문 바로가기
IT 이야기/Java

[Java Study] 11일차 Enum

by Dblog 2021. 1. 26.
728x90

학습할 것

  • enum 정의하는 방법
  • enum이 제공하는 메소드 (values()와 valueOf())
  • java.lang.Enum
  • EnumSet

Enum class

열거형으로 불리며 JDK 1.5 버젼부터 지원하고 있습니다. 

상수처럼 사용하고 있기 때문에 정의할때 필드 이름은 대문자로 사용하고 있으며 문자열에 비해  IDE의 많은 지원, 허용 값 제한 등의 장점을 가지고 있습니다. 

또한 리팩토링시 변경범위가 줄어든다는 장점이 있다고 합니다.
※ woowabros.github.io/tools/2017/07/10/java-enum-uses.html

 

enum 정의하는 방법

가장 기본이 되는 정의법은 enum 키워드 옆에 객체 이름을 넣고 {}안에 type을 정의합니다.

enum [name] { type1, type2, ... }

 

Enum을 사용했을때의 장점이 그냥 보기엔 딱히 없어보이지만 아래 예시를 조금더 큰 범위로 확장하여 생각한다면 코드의 구조가 좋아지는 것 외에도 생각보다 많은 이득을 가져올 수 있습니다.

 

 docs.oracle.com/javase/8/docs/technotes/guides/language/enums.html
Enum 적용전 코드

public class EnumTest {
    final String Sunday ="SUNDAY";
    final String Monday ="MONDAY";
    final String Tuesday ="TUESDAY";
    final String Wenesday ="WEDNESDAY";
    final String Thursday ="THURSDAY";
    final String Friday ="FRIDAY";
    final String Saturday ="SATURDAY";
    
    public void tellItLikeItIs(String day) {
        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;
        }
    }
}

 

Enum 적용후 코드

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

 

 

 

enum이 제공하는 메소드 (values()와 valueOf())

 

  • valueOf()

Equals와 비슷한 함수라고 생각할 수 있습니다. valuesOf("TEXT") 와 같이 () 안에 들어있는 텍스트가 enum안에 있다면 객체를 리턴하고 만약 enum에 없다면 exception error을 발생하게 됩니다. 

https://docs.oracle.com/javase/8/docs/api/

 

valuesOf() 메서드를 가지고 테스트 해봤을때 Day에 없는 값을 넣었을때는 에러가 발생했습니다.

public class EnumTest {
	enum Day {
	    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
	    THURSDAY, FRIDAY, SATURDAY 
	}
    
    public static void main(String[] args) {
        System.out.println(Day.valueOf("TUESDAY")); // return TUESDAY
        System.out.println(Day.valueOf(" "));  //  Excetion error
        System.out.println(Day.valueOf("하이"));  //  Excetion error
    }
}

 

  • values()

구글에 검색해보니 serialize가 검색됩니다 모든 원소를 배열에 담아줄 것으라고 예상하고 테스트를 해봤습니다.

public class EnumTest {
	enum Day {
	    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
	    THURSDAY, FRIDAY, SATURDAY 
	}

    public static void main(String[] args) {
    	for(Day type : Day.values()) {
    		System.out.println(type);
    	}
        
    }
}

결과를 보니 예상대로 모든 원소를 배열에 담았습니다. 

재밌는 것은 순서가 없을것이라 생각했는데 선언한 순서대로 배열에 담기고 있었습니다. 당연히 index를 통해 접근할 수 있었습니다.

SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY

 

java.lang.Enum

java.lang은 Java의 기본 클래스들을 가지고 있으며 Enum은 java.lang 패키지에 포함되어있는 클래스 입니다.

https://docs.oracle.com/javase/8/docs/api/java/lang/class-use/Enum.html

java의 공통 Enum 클래스의 사용법이며 <> 안에 E는 enum타입의 서브클래스 임이 명시되어 있습니다.

Enum<E extends Enum<E>>

 

https://docs.oracle.com/javase/8/docs/api/

또한 EnumConstantNotPresentException 클래스 java.utils 패키지 등 다양한 메서드와 클래스에서 enum 타입을 사용하고 있습니다. 

 

 

EnumSet

set을 사용하는 이유는 다른 list, arrarylist와는 다르게 검색속도가 빠르다는 장점이 있습니다. 물론 set의 장점을 EnumSet에도 적용할 수 있습니다. 

특히 EnumSet은 비트연산을 사용하기 때문에 일반 HashSet 보다 속도가 월등히 빠를수 밖에 없습니다.

https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html

Set<MyEnum> s = Collections.synchronizedSet(EnumSet.noneOf(MyEnum.class));

공식 문서의 설명을 보면 비트벡터를 사용며 공간, 시간적으로 탁월한 효능을 보장함을 알수 있습니다.

728x90

댓글