본문 바로가기
TIL

Java - enum 타입 (22.11.21 TIL)

by winteringg 2022. 11. 21.

오늘도 돌아온 Jenna 의 자바 개념 정리 시간~ 📌


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.열거형

'TIL' 카테고리의 다른 글

스프링 @ActiveProfiles (22.11.23 TIL)  (0) 2022.11.23
애매한 완벽주의 버리기 (22.11.22 TIL)  (0) 2022.11.22
Web Storage (22.11.20 TIL)  (0) 2022.11.20
인수 테스트 (22.11.19 TIL)  (0) 2022.11.19
리액트 - useRef (22.11.18 TIL)  (0) 2022.11.18

댓글