2024.06.03. MON <D + 14>
~2024.06.04. TUE <D + 15>, Enum (열거형)
A. Enum (열거형)
A-1. 열거형을 사용하는 이유 : 관련된 상수를 한 곳에 모아서 사용하기 위함.
A-2. 열거형의 기반: java.lang.Enum
name() => 상수의 이름을 문자열로 반환
ordinal() => 열거형 상수가 정의된 순서를 정수로 반환
valueOf() => 매개변수와 일치하는 열거형 상수를 반환
ex) Enum을 사용하지 않고 상수를 정의하는 방법
class Card{
static final int CLOVER = 0;
static final int HEART = 1;
static int THREE = 1;
static final int TWO = 0;
final int kind;
final int num;
}
ex) 위에 코드에 Enum을 추가하여 수정해 보기
class Card {
enum Kind {CLOVER, HEART ...}
enum Value {TWO, THREE, ...}
final int kind;
final int num;
}
A-3. 열거형의 활용 및 확장
ComparTo() 는 사용 가능!// enum 열거형을 생성해보자.
enum Direction {EAST, SOUHT, WEST, NORTH}
// enum 열거형의 활용과 확장
enum Direction2 {EAST, SOUHT, WEST, NORTH}
// -> 내부적으로 관리되는 순서 정보 => 정수형으로, 0부터 시작함.
public class EnumEx1 {
public static void main(String[] args) {
// enum 1. 상수 초기화 해보기.
Direction d1 = Direction.EAST;
Direction d2 = Direction.valueOf("WEST");
Direction d3 = Enum.valueOf(Direction.class, "EAST");
//Direction d4 = Direction2.EAST;
System.out.println("d1 = " + d1);
System.out.println("d2 = " + d2);
System.out.println("d3 = " + d3);
System.out.println();
// enum 열거형의 활용과 확장
System.out.println("d1 == d2 => " + (d1 == d2));
/*System.out.println("d1 == d4 => " + (d1 == d4));
System.out.println("Direction.EAST == Direction2.EAST = "
+(Direction.EAST == Direction2.EAST)); -> 오류 발생 */
// 2. Values 사용시, Enum의 상수 정보를 배열로 반환한다.
Direction[] dirArr = Direction.values();
for(Direction d : dirArr) {
System.out.printf("%s = %d %n", d.name(), d.ordinal());
//3. switch 문을 사용해보자
switch(d1) {
case EAST:
System.out.println("동쪽 - EAST");
break;
case SOUHT:
System.out.println("서쪽 - SOUTH");
break;
default:
System.out.println("없는 정보임.");
}
}
} //end of main
} // end of class
A-4. 열거형의 상수의 구성 정보 (+ 불연속적인 상수값, + 상수값 외의 추가적인 정보)
enum Direction3 {
// 상수 선언하기.
// EAST, SOUTH, WEST, NORTH - 상수 명
EAST(1, ">"), SOUTH(2, "v"), WEST(3, "<"), NORTH(4, "^");
/* 1. 생성자 필수
2. 인스턴스 상수 변수
3. 생성자에 인스턴스 상수 변수 초기화 */
private static final Direction3[] DIR_ARR = Direction3.values();
private final int value; // 상수값
private final String symbol;
Direction3 (int value, String symbol) {
// 멤버변수 추가가 목표
this.value = value;
this.symbol = symbol;
}
// 상수값 게터
public int getValue() {return value;}
public String getSymbol() {return symbol;}
// 정수(위치정보) 매개변수를 받아서 해당 상수를 반환하는 메소드.
public static Direction3 getDirection (int idx) {
if(idx < 1 || idx > 4) {
throw new IllegalArgumentException("Invalld: " + idx);
}
// oridinal()
return DIR_ARR[idx-1];
}
public String toString() {
return name() + " " + getSymbol();
}
}
public class EnumEx2 {
public static void main(String[] args) {
for (Direction3 d : Direction3.values())
System.out.printf("%s = %s %n ", d.name(), d.getSymbol());
// 위치정보를 사용해서 상수를 반환하는 메소드 사용
Direction3 d3 = Direction3.getDirection(1);
// 상수명, 상수값, 심볼
System.out.printf("d3 = %s, %d, %s\n", d3.name(), d3.getValue(), d3.getSymbol());
} //end of main
} // end of class