기존에 상수를 정의하는 방법이였던 final static string 과 같이 문자열이나 숫자들을 나타내는 기본자료형의 값을 enum을 이용해서 같은 효과를 낼 수 있다.
< enum의 장점 >
코드가 단순해지며, 가독성이 좋아짐
인스턴스 생성과 상속을 방지 ⇒ 상수값의 타입안정성 보장
enum을 사용해 새로운 상수들의 타입을 정의함으로써 정의한 타입이외의 타입을 가진 데이터값을 컴파일시 체크함(⇒ 문법적 오류를 찾아낼 수 있다)
키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 알 수 있음
<Ex.java>
enum 도 class/interface 만드는 것처럼 만든다 ⇒ enum키워드 enum명 {}
enum Grade {
// 단순히 사용할 상수의 이름을 나열하기만 하면 된다.
SALES, PART_TIME_JOP, NORMAL
}
<Ex.java ⇒ main()에서 호출>
선언한 SALES, PART_TIME_JOP, NORMAL 전부 S(Static)와 F(Final)가 붙은 것을 볼 수 있다.
출력창 (enum에 나열했던 것이 이름이자 값이다!)
Enum{} ⇒ E 라고 표시되어있음
TestEnum 에 Grade.SALES 를 넣으려면 오류남
오류창 확인 : 다른 타입의 enum 상수 저장 불가(Grade 타입과 TestEnum 타입)
대문자 사용(enum 아니고 Enum)
출력창
p. 298
main() 메서드 안에 저장된 ‘//enum 상수에 대한 판별’을 calculate() 메서드로 만든다.
따로 calculate() 메서드로 만들어줌
메인창에서 호출해봄
출력창
이건 오류남!
오류창 확인 : Grade 타입 enum 상수만 전달 가능! (SPRING은 Season 타입)
instanceof 를 사용하였을 때 오류남.
오류창 확인 : 일치하지 않는 타입이라서 오류
Ex.java에 이 부분 Season1로 바꾸기(Ex2.java 에서 Season 을 만들거기 때문에)
p.300
======== Ex2.java
public class Ex2 {
public static void main(String[] args) {
}
public void compareEnum(Season season) {
}
public void enumSwitch(Season season) {
}
}
enum Season {
SPRING, SUMMER, FALL, WINTER
}
이렇게 틀 먼저 만들기
enum Season {
// enum 상수는 자동으로 ordinal 값이 순차적으로 부여되며,
// 인덱스처럼 0부터 부여됨
SPRING/*0*/, SUMMER/*1*/, FALL/*2*/, WINTER/*3*/
// 여기 부여된 숫자 값 잘보기!
// (이 값이 실제 int 값은 아니기 때문에 부등호로 비교 불가)
}
enum Season{} 정의
enum 에서 열거된 상수들도 대문자로 적어줌(→ 좋은 코드)
출력창 -1 숫자 잘 보기!
이런식으로 계산 됨! (enum 내부에 인덱스처럼 부여된 숫자 확인)
> switch ~ case 문(조건문) 사용
⇒ switch() 파라미터 값으로 정수값, 문자열, Enum 3가지만 가능
여기선 Enum 타입 season 을 넣어줌
값을 불러올 때 season. 을 붙이지 않는다!
⇒ 붙일 경우 이렇게 오류 뜸
switch 문에 전달받은 enum 타입을 자동으로 감지!
public void enumSwitch(Season season) {
// switch() 파라미터로 정수, 문자열, enum 3가지만 전달 가능
// enum 타입 전달 시 case 문에는 상수 이름만 사용하면 됨!
switch (season) { // switch 문에 전달받은 enum 타입을 자동 감지
case SPRING : // Season.SPRING 지정 시 오류 발생!
System.out.println("봄!");
break;
case SUMMER :
System.out.println("여름!");
break;
case FALL :
System.out.println("가을!");
break;
case WINTER :
System.out.println("겨울!");
}
}