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 |
댓글