본문 바로가기
JAVA

Java - 열거 (enum)

by winteringg 2022. 11. 21.

1. 열거 타입 (Enumeration Type)
1) 한정된 값만을 갖는 데이터 타입 (가을, 겨울, 로그인 성공, 로그인 실패 등).
2) 관련된 상수들을 같이 묶어 놓은 것. (무늬는 무늬끼리, 숫자는 숫자끼리)
  - Java는 타입에 안전한 열거형을 제공. 

class Card {
   enum Kind { CLOVER, HEART, DIAMOND, SPADE }  //열거형 Kind를 정의
   enum Value { TWO, THREE, FOUR }              //열거형 Value를 정의
   
   final Kind kind;  //타입이 int 가 아닌 kind 임.
   final Value value;
   
   if(Card.Kind.CLOVER == Card.Value.TWO) {  //타입이 달라서 비교 불가. 컴파일 에러
   }                                         //이처럼 Java는 타입에 안전한 열거형을 제공


3) 한정된 값은 열거 상수(Enumeration Constant)로 정의. (Week 라는 타입을 열거 타입으로 선언하게 되면, '월화수목금토일'을 열거 상수로 정의해야 함)
4) 열거형 상수 비교는 == 와 compareTo() 사용 가능

2. 열거 타입 선언
1) 열거 타입 소스 파일 생성 : ~.java
2) 열거 타입 이름의 첫 문자는 대문자로 작성하는 것이 관례.
  - Week.java
  - MemberGrade.java
3) 소스 작성 방법
  - 파일 이름과 동일한 이름으로 다음과 같이 선언
  - public enum 열거타입이름 { ..열거상수.. }
4) 한정된 값인 열거 상수 정의
  - 열거 상수 이름은 관례적으로 모두 대문자로 작성함.
  - 다른 단어가 결합된 이름일 경우 관례적으로 언더바_로 연결함.
  - public enum Week { MONDAY, TUESDAY, WEDNESDAY..... }
  - public enum LoginResult { LOGIN_SUCCESS, LOGIN_FAILED }

public enum Week {
	MONDAY,
	TUESDAY,
	WEDNESDAY,
	THURSDAY,
	FRIDAY,
	SATURDAY,
	SUNDAY
}

5) 열거 타입 변수 선언
  - 열거타입 변수;
  - Week today; Week reservationDay;
6) 열거 상수값 저장
  - 열거 타입 변수값은 열거 상수 중 하나여야 함.
  - 열거타입 변수 = 열거타입.열거상수;
  - Week today = Week.SUNDAY;
7) 열거 타입 변수는 참조 타입
  - 열거 타입 변수는 참조 타입이므로 null값을 저장할 수 있음.
  - Week birthday = null;
8) 열거 상수는 열거 객체를 참조함.
  - 열거 객체는 heap에 생성됨.
  - 열거 상수는 메소드 영역에서 열거 객체를 참조함.
  - 열거타입 변수도 stack 영역에서 열거 객체를 참조함. 즉 열거상수와 같은 번지수를 공유함.

Week today = Week.SUNDAY;

today == Week.SUNDAY                    //true

Week week1 = Week.SATURDAY;
Week Week2 = Week.SATURDAY;
System.out.println(week1 == week2);     //true

 

3. 열거 객체의 메소드
1) 열거 객체는 열거 상수의 문자열을 내부 데이터로 가지고 있음.
2) 열거 타입은 컴파일시에 java.lang.Enum 클래스를 자동 상속함.
  - 열거 객체는 java.lang.Enum 클래스의 메소드를 사용할 수 있음.

메소드(매개변수) 설명
String name() 열거형 상수의 이름을 문자열로 반환
int ordinal() 열거형 상수가 정의된 순서를 반환 (0부터 시작)
int compareTo() 열거 객체를 비교해서 순번 차이를 반환
T valueOf(Class<T> enumType, String name) 지정된 열거형에서 name과 일치하는 열거형 상수를 반환
Class<E> getDeclaringClass() 열거형의 Class 객체를 반환
values()  //컴파일러가 자동으로 추가 열거형 상수 모두를 배열로 반환
valueOf(String name) 
//컴파일러가 자동으로 추가
주어진 문자열의 열거 객체를 반환
 

3) name() 메소드
  - 열거 객체의 문자열 리턴
     Week today = Week.SUNDAY;
     String name = today.name()
      => 열거 타입 변수 today 에 SUNDAY 라는 상수를 저장하고 today.name() 메소드를 호출하게 되면, SUNDAY 열거상수의 문자열을 반환함.

//name() 메소드

Week today = Week.SUNDAY;
String name = today.name();
	System.out.println(name);     //SUNDAY 가 출력됨.


4) ordinal() 메소드
  - 열거 객체의 순번(0부터 시작)을 리턴
     Week today = Week.SUNDAY;
      int ordinal = today.ordinal()
      => 열거 타입 변수 today 에 SUNDAY 라는 상수를 저장하고 today.ordinal() 메소드를 호출하게 되면 SUNDAY 열거상수 순번을 반환함. 

//ordinal() 메소드

public enum Week {
	MONDAY,
	TUESDAY,
	WEDNESDAY,
	THURSDAY,
	FRIDAY,
	SATURDAY,
	SUNDAY
}

Week today = Week.SUNDAY;
int ordinal = today.ordinal();     //SUNDAY는 6번에 있으므로 정수 6이 출력됨

5) compareTo() 메소드
  - 열거 상수 순번의 차이를 계산하여 리턴해줌.

//compareTo() 메소드

public enum Week {
	MONDAY,
	TUESDAY,
	WEDNESDAY,
	THURSDAY,
	FRIDAY,
	SATURDAY,
	SUNDAY
}

Week day1 = Week.MONDAY;
Week day2 = Week.WEDNESDAY;
int result1 = day1.compareTo(day2);
int result2 = day2.compareTo(day1);
System.out.prinln(result1);    // 0-2가 되어서 -2가 출력
System.out.prinln(result2);    // 2-0이 되어서 2가 출력


6) valueOf() 메소드
  - 주어진 문자열의 열거 객체를 리턴
     Week weekDay = Week.valueOf("SUNDAY");
     => SUNDAY 문자열과 동일한 문자열을 가지고 있는 열거객체의 생성 번지를 리턴시켜줌.

//valueOf 메소드

Week weekDay = Week.valueOf("SUNDAY");
if(weekDay == Week.SUNDAY) {
	System.out.println("주말 이군요.")
}else {
	System.out.println("평일 이군요.")
}

//weekDay == Week.SUNDAY 같은 객체를 공유하는 메소드이기 때문에 "주말 이군요." 가 출력됨.


7) values() 메소드
  - 모든 열거 객체들을 배열로 만들어줌.

//values() 메소드

Week[] days = Week.values();
for(Week day : days) {
	System.out.println(day);
}

//열거 객체 Week의 번지를 day가 가지게 되며,
//열거 객체의 문자열을 아래와 같이 출력하게 됨.

MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

 
4. 열거형에 멤버 추가하기
1) 불연속적인 열거형 상수의 경우, 원하는 값을 괄호()안에 적음.

enum Direction { EAST(1), SOUTH(5), WEST(-1), NORTH(10) }

  - 위처럼 괄호()를 사용하려면 인스턴스 변수와 생성자를 새로 추가해줘야 함.

enum Direction {
   EAST(1), SOUTH(5), WEST(-1), NORTH(10);  //끝에 '세미콜론(;)'을 추가해야 함.
   
   private final int value;   //정수를 저장할 필드(인스턴스 변수)를 추가
   
   Direction(int value) {     //생성자를 추가. 열거형의 생성자는 기본적으로 priavte 임
     this.value = value;
   }
   public int getValue() {
     return value;
   }

  - 열거형의 생성자는 묵시적으로 private 이므로, 외부에서 객체생성 불가

Direction d = new Direction(1);  //컴파일 에러. 열거형의 생성자는 외부에서 호출 불가

 

 

 

참고 : [한빛미디어] 이것이 자바다 (신용권의 Java 프로그래밍 정복) Chapter 5.배열
참고 : [도우출판] JAVA의 정석(3ND EDITION)-자바의 정석 최신 Java 8.0 포함 Chapter 17.열거형

'JAVA' 카테고리의 다른 글

Java - Stack 과 Queue  (0) 2022.11.05
JAVA - Stream (스트림)  (0) 2022.10.29
Java - Arrays 클래스  (0) 2022.10.29
Java - 다형성, instanceof  (0) 2022.10.29
Java - 제네릭스 (Generics)  (0) 2022.10.29

댓글