enum(열거형)
==> 서로 관련있는 상수들의 집합을 나타낸다.
==> 클래스처럼 보이게 하는 상수
==> 열거형은 class처럼 독립된 java파일에 만들 수 있고,
하나의 java파일에 클래스와 같이 만들 수 있고,
class안에 내부 클래스처럼 만들 수 있다.
1) name() ==> 열거형 상수의 이름을 문자열로 반환한다.
2) ordinal() ==> 열거형 상수가 정의된 순서값(index값)을 반환한다.
(0부터 시작)
3) valueOf("열거형상수명") ==> 지정된 열거형에서 '열거형상수명'과
일치하는 열거형 상수를 반환한다.
4) 열거형이름.상수명 ==> valueOf("상수명")메서드와 같다.
방법1)
enum 열거형이름 { 상수명1, 상수명2, 상수명3, ...}
방법2)
enum 열거형이름{
상수명1(값들...),
//자료형이 같은 값들이 와야함(값은 다른곳에서 가져다 쓸수 있어야 함-> 변수 만들기)
상수명2(값들...), //변수의 개수는 괄호 속 값의 개수와 일치 해야함
상수명3(값들...),
...
상수명n(값들...);
//'값들'이 저장될 변수들 선언한다.
//'값들'이 개수만큼의 변수를 선언한다.
private 자료형이름 변수명1;
...
// - 열거형의 생성자를 만든다.
// - 열거형의 생성자는 '열거형상수'의 '값들'을 셋팅하는 역할을 수행한다.
// - 열거형 생성자는 묵시적으로 'private'이다.
// '변수명'은 '값들'과 개수가 같고,
// 각각의 '값들'과 자료형이 맞아야 한다.
private 열거형이름(자료형이름 변수명, ...){
위에 선언된 변수들을 매개변수를 이용해서 초기화 한다.
...
}
//구성된 '값들'을 외부에서 불러올 수 있도록 getter메서드를 작성한다.
public 자료형이름 get변수명1(){
return 변수명1;
}
...
}
package kr.or.didt.basic.enumtest;
public class EnumTest {
public enum Color { RED, GREEN, BLUE }
// Color는 클래스와 비슷한 역할 / ordinal값 {0,1,2}
public enum Count { ONE, TWO, THREE }
public enum Season{
봄("3월부터 5월까지"),
//상수명(값들...) 형식의 선언 : 지금은 문자열 한가지만 있는것
여름("6월부터 8월까지"),
가을("9월부터 11월까지"),
겨울("12월부터 2월까지");
//값이 저장될 변수 선언
private String span;
//생성자
Season(String months){
//private Season(String month){와 같다} : private생략가능
span = months; // 변수에 값을 초기화하는 작업을 수행한다.
}
//getter생성
public String getSpan(){
return span;
}
}
public static void main(String[] args) {
//일반적인 상수에 대한 단점
/*System.out.println("Red : " + ConstTest.RED);
//ConstTest의RED상수를 가져다 쓰는것
System.out.println("Three : " + ConstTest.THREE);
if(ConstTest.RED == ConstTest.TWO){
//문법으로 틀리지는 않지만 색상과 숫자를 비교하는 것은 논리적으로 맞지 않음
//(에러 발생 이유의 원인)
System.out.println(".....");
}else{
System.out.println("#####");
}*/
Color mycol = Color.valueOf("GREEN"); //Color.GREEN과 같다.
Count mycnt = Count.ONE;//Count.valueOf("ONE")와 같다.
System.out.println("mycol : " + mycol.name());
System.out.println("mycol : " + mycnt.name());
System.out.println("mycol ordinal : " + mycol.ordinal());
System.out.println("mycol ordinal : " + mycnt.ordinal());
//서로 다른 열거형끼리의 비교는 불가능하다.
/*if(Color.RED == Count.TWO){//비교 자체가 문법적으로 안됨(에러)
System.out.println("....");
}*/
if(mycol == Color.BLUE){
System.out.println("같다.");
}else{
System.out.println("같지 않다.");
}
System.out.println("---------------------------------------");
Season ss = Season.valueOf("봄");
System.out.println("name : "+ss.name());
System.out.println("ordinal : "+ss.ordinal());
System.out.println("span : "+ss.getSpan());
System.out.println();
//열거형명.values() ==> 모든 상수들을 가져와 배열로 반환한다.
for(Season time : Season.values()){
System.out.println(time.name() + " == " + time + "==>" + time.getSpan());
}
System.out.println();
for(Color col : Color.values()){
System.out.println(col + "==>" + col.ordinal());
}
}
}
다른 클래스
package kr.or.didt.basic.enumtest;
public class ConstTest {
//색상관련 상수
public final static int RED = 1;
public final static int GREEN = 2;
public final static int BLUE = 3;
//숫자 관련 상수
public final static int ONE = 1;
public final static int TWO = 2;
public final static int THREE = 3;
}