728x90
열거형(enum)
- 관련된 상수들을 같이 묶어 놓은 것. Java는 타입에 안전한 열거형을 제공
class Card{
static final int CLOVER = 0;
static final int HREAT = 1;
static final int DIAMOND = 2;
static final int SPADE = 3;
static final int ONE = 0;
static final int TWO = 1;
static final int THREE = 2;
final int kind;
final int num;
}
class Card{
enum Kind {CLOVER, HEART, DIAMOND, SPADE} //열거형 Kind 정의(0,1,2,3)
enum Value {ONE, TWO, THREE} // 열거형 Value 정의
final Kind kind; //타입이 int가 아닌 Kind
final Value value; //타입이 int가 아닌 Value
}
//위의 코드의 경우
if(Card.CLOVER == Card.ONE) //결과가 true지만 의미상 false이어야함
//아래 코드의 경우
if(Card.Kind.CLOVER == Card.Value.ONE) //컴파일 에러. 타입이 달라서 비교 불가
- Java의 열거형은 값과 타입 모두 확인. ※C언어의 경우 값만 체크
열거형의 정의와 사용
- 열거형 정의
enum 열거형이름{상수명1, 상수명2,...}
//ex) enum Compass{EAST, SOUTH, WEST, NORTH}
- 열거형 타입의 변수를 선언 및 사용
class Unit{
int x, y; //유닛의 좌표
Compass cp; //열거형 인스턴스 변수 선언
void init(){
cp = Compass.EAST; //EAST로 초기화
}
}
- 열거형 상수의 비교에 '=='와 compareTo() 사용가능
if(cp == Compass.EAST){
x++;
} else if(cp.compareTo(Compass.WEST) > 0){ //compareTo() : 왼쪽이 크면 양수, 같으면 0, 오른쪽이 크면 음수
....
}else if(cp > Compass.WEST){ //에러. 열거형 상수에 비교연산자 사용불가
...
}
열거형의 조상 java.lang.Enum(클래스)
- 모든 열거형은 Enum의 자손, 메소드를 상속
String name() : 열거형 상수의 이름을 문자열로 반환
int ordinal() : 열거형 상수가 정의된 순서를 반환(0부터 시작)
T valueOf(Class<T> enumType, String name) : 지정된 열거형에서 name과 일치하는 상수를 반환 - values(), valueOf()는 컴파일러가 자동을 추가
package chapter12;
enum Compass{EAST, SOUTH, WEST, NORTH}
// 0, 1, 2, 3
public class Study08 {
public static void main(String[] args) {
Compass c1 = Compass.EAST;
Compass c2 = Compass.valueOf("WEST");
Compass c3 = Enum.valueOf(Compass.class, "EAST");
System.out.println("c1 = " + c1);
System.out.println("c2 = " + c2);
System.out.println("c3 = " + c3);
System.out.println("==============");
System.out.println("c1==c2 ? " + (c1==c2));
System.out.println("c1==c3 ? " + (c1==c3));
System.out.println("c1.equals(c3) ? " + c1.equals(c3)); //enum의 상수는 객체이기 때문에 가능
// System.out.println("c1>c2 ? " + (c1>c2)); //에러. 비교연산자 사용 불가
System.out.println("c1.compareTo(c3) ? " + c1.compareTo(c3)); //compareTo() : 왼쪽이 크면 양수, 오른쪽이 크면 음수, 같으면 0을 반환
System.out.println("c1.compareTo(c2) ? " + c1.compareTo(c2));
System.out.println("==============");
switch(c1) {
case EAST : //Direction.EAST라고 쓸 수 없음
System.out.println("The Compass is EAST");
break;
case SOUTH :
System.out.println("The Compass is SOUTH");
break;
case WEST :
System.out.println("The Compass is WEST");
break;
case NORTH :
System.out.println("The Compass is NORTH");
break;
default :
System.out.println("Invalid compass");
break;
}
System.out.println("==============");
Compass[] cArr = Compass.values(); //열거형의 모든 상수를 배열로 반환
for(Compass c : cArr)
System.out.printf("%s=%d%n", c.name(), c.ordinal()); //c.ordinal() 순서
}
}
열거형에 멤버 추가
- 불연속적인 열거형 상수의 경우, 원하는 값을 괄호() 안에 적음
- 괄호()를 사용하려면, 인스턴스 변수와 생성자를 새로 추가해줘야함
enum Compass {EAST(1), SOUTH(5), WEST(-1), NORTH(10)}
enum Compass{
EAST(1), SOUTH(5), WEST(-1), NORTH(10);
private final int value; //인스턴스 변수를 추가
Compass(int value){this.value = value;} // 생성자 추가
public int getValue(){return value;}
}
- 열거형의 생성자는 묵시적으로 private 이므로, 외부에서 객체 생성 불가
Compass cp = new Compass(1); //에러. 열거형의 생성자는 외부에서 호출불가
package chapter12;
enum Compass1{
EAST(1, ">"), SOUTH(2,"V"), WEST(3, "<"), NORTH(4,"^");
private static final Compass1[] CP_ARR = Compass1.values();
private final int i;
private final String string;
Compass1(int i, String string) { //private Compass(int i)
this.i = i;
this.string = string;
}
public int getI() {return i;}
public String getString() {return string;}
public static Compass1 of(int dir) {
if(dir<1 || dir >4) {
throw new IllegalArgumentException("Invalid : " + dir);
}
return CP_ARR[dir-1];
}
public Compass1 rotate(int num) {
num = num %4;
if(num<0) num +=4; //num이; 음수일 때는 시계반대 방향으로 회전
return CP_ARR[(i-1+num)%4];
}
public String toString() {
return name() + " "+ getString();
}
}
public class Study09 {
public static void main(String[] args) {
for(Compass1 c : Compass1.values())
System.out.printf("%s=%d%n", c.name(), c.getI());
Compass1 c1 = Compass1.EAST;
Compass1 c2 = Compass1.of(1);
System.out.printf("c1=%s, %d%n", c1.name(),c1.getI());
System.out.printf("c2=%s, %d%n", c2.name(),c2.getI());
System.out.println(Compass1.EAST.rotate(1));
System.out.println(Compass1.EAST.rotate(-2));
}
}
728x90