학습할 것
- 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을 발생하게 됩니다.
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 패키지에 포함되어있는 클래스 입니다.
java의 공통 Enum 클래스의 사용법이며 <> 안에 E는 enum타입의 서브클래스 임이 명시되어 있습니다.
Enum<E extends Enum<E>>
또한 EnumConstantNotPresentException 클래스 java.utils 패키지 등 다양한 메서드와 클래스에서 enum 타입을 사용하고 있습니다.
EnumSet
set을 사용하는 이유는 다른 list, arrarylist와는 다르게 검색속도가 빠르다는 장점이 있습니다. 물론 set의 장점을 EnumSet에도 적용할 수 있습니다.
특히 EnumSet은 비트연산을 사용하기 때문에 일반 HashSet 보다 속도가 월등히 빠를수 밖에 없습니다.
Set<MyEnum> s = Collections.synchronizedSet(EnumSet.noneOf(MyEnum.class));
공식 문서의 설명을 보면 비트벡터를 사용며 공간, 시간적으로 탁월한 효능을 보장함을 알수 있습니다.
'IT 이야기 > Java' 카테고리의 다른 글
[Java Study] 13일차 I/O [input/output] (0) | 2021.02.13 |
---|---|
[Java Study] 12일차 Annotation (0) | 2021.02.04 |
[Java Study] 10일차 Thread, Runnable (0) | 2021.01.17 |
[Java Study] 9일차 예외처리(try, catch, throw, throws, finally) (0) | 2021.01.11 |
[Java Study] 8일차 인터페이스(interface) (0) | 2021.01.06 |
댓글