-
[Java-34] Enum 기본 (열거 타입)Java 2021. 1. 27. 13:17
Java Enum
열거타입, Enum 정의 하는법
데이터를 저장할 때 우리는 가끔 한정된 값으로만 데이터를 저장해야할 때가 많이 있을 거시다. 예를 들어서 4계절 을 따져볼 때, FourSeason(Spring, Summber, Fall, Winter) 이 4가지를 제외하고 다른 계절이 올 수 없을 것이다. 그럼 우리는
public static void main( String[] args ) { String season = "winter"; }
다음과 같이 직접 String타입의 필드를 선언해주고, 리터럴을 입력해줘야 하지만, Enum(열거타입)을 사용하게 되면, 이를 *enum 타입으로 정의할 수 있다. *
enum 정의 하는 법
enum.java
public enum Season { SPRING, // 봄 SUMMER, // 여름 FALL, // 가을 WINTER // 겨울 }
public enum (열거타입 이름)으로 선언이 올 수 있다. enum 키워드는 반드시 소문자로 만들어야 한다. 그리고 열거 상수를 선엉ㄴ하면 되는데, 관례적으로 열거 상수는 모두 대문자로 작성하도록 한다.
클래스 내부에서 정의
public class Vacation { LocalDate data = LocalDate.now(); FourSeason fourSeason = FourSeason.SPRING; enum FourSeason{ SPRING, SUMMER, FALL, WINTER } }
enum 변수 선언
public class Vacation { LocalDate data = LocalDate.now(); Season season; // 열거타입 + 변수 ; public Vacation(Season season){ this.season = season; } }
다음과 같이 enum 타입 열거타입으로 변수를 선언이 가능 하다.
enum 변수 초기화
public static void main(String[] args) { // 열거타입 변수 = 열거타입.열거상수; Vacation summerVacation = new Vacation(Season.SUMMER); Vacation winterVacation = new Vacation(Season.WINTER); // null 로도 선언 가능 Vacation nullVacation = new Vacation(null); }
Enum 메소드
1. name()
public static void main(String[] args) { Season nowSeason = Season.SPRING; String name = nowSeason; // Error String name = nowSeason.name(); // "Spring" 반환 }
enum 의 상수를 String 문자열로 반환한다.
2. Ordinal()
enum 상수가 몇번째에 있는지 확인해주는 메소드 이다.
public enum Season { SPRING, // 0 SUMMER, // 1 FALL, // 2 WINTER // 3 }
public static void main(String[] args) { Season nowSeason = Season.SPRING; int num = nowSeason.ordinal(); System.out.println(num); // 0 출력 }
하지만 별로 사용하는 걸 추천하지 않는다. 순서에 따라 출력이 되기 때문에 지금은 Spring 이 0 번 째 이지만, 만약 SPRING 앞에 다른 열거상수 가 들어오게 되면 SPRING 은 유동적으로 1로 변하기 때문이다.
valueOf()
valueOf(" str ") 을 통해 enum 에 정의된 " str " 과 똑같은 문자열의 객체를 반환 하게 된다.
public static void main(String[] args) { Season season = Season.valueOf("SPRING"); if(season == Season.SPRING){ System.out.println("season == SPRING"); //출력 } }
values
values 메소드는 이넘의 모든 객체들을 배열로 만들어 리턴한다.
public static void main(String[] args) { Season[] seasons = Season.values(); for(Season s : seasons){ System.out.println(); } }
java.lang.Enum
이런 메소드들은 어디에 정의되어있는 걸까? 바로 java.lang.enum 에 추상클래스의 형태로 정의되어있다. 모든 클래스는 Object가 조상클래스 이듯이, 모든 이넘 클래스들은 java.lang.enum 이 조상인데, 안타깝지만 모든 메소드들은 final 로 정의 되어있기 때문에 overriding이 불가능 하다.
package org.example; public enum Season { SPRING, // 0 SUMMER, // 1 FALL, // 2 WINTER // 3 public String name(){ //Error //code } } Error : 'name()' cannot override 'name()' in 'java.lang.Enum'; overridden method is final
EnumSet
EnumSet 이란 enum 타입을 set 자료구조의 형태로 사용할 수 있는 형태를 말한다.
public static void main( String[] args ) { String season = "winter"; EnumSet<Season> seasonEnumSet = EnumSet.allOf(Season.class); // 모든 Season의 열거 원소를 set에 추가 EnumSet<Season> seasonEnumSet1 = EnumSet.of(Season.SPRING, Season.SUMMER); // 선택된 Season 원소를 Set에 추 Iterator<Season> iter = seasonEnumSet.iterator(); // 이터레이터 형태로도 사용 가능 while (iter.hasNext()){ System.out.println(iter.next()); } }
'Java' 카테고리의 다른 글
[Java-36] 자바 제네릭, < > (0) 2021.02.24 [Java-35] Lombok @Getter, @Setter 직접 만들어 보자 (1) 2021.02.10 [Java-33] java 스레드(Thread) 기본기 (14) 2021.01.19 [Java-32] java 예외처리 기본기 (0) 2021.01.12 [Java-31] java8 이전 의 인터페이스 (0) 2021.01.07