organize/자바

Java 31

001cloudid 2024. 8. 15. 14:56
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

'organize > 자바' 카테고리의 다른 글

Java 33  (0) 2024.08.21
Java 32  (0) 2024.08.20
Java 30  (0) 2024.08.14
Java 29  (0) 2024.08.13
Java 28  (0) 2024.05.16