이 글은 유튜브 '자바의 정석 - 기초편'을 보고 정리한 글입니다.
📂content
1. 열거형
- 관련된 상수들을 같이 묶어 놓은 것. Java는 타입에 안전한 열거형을 제공
알아서 숫자를 부여해준다.
if(Card.CLOVER == Card.TWO) 라는 코드가 있다고 하자. true이지만 false여야 의미상 맞다.
Java는 값과 타입을 모두 체크한다. 그렇기 때문에 위 코드를 쓰면 컴파일 에러가 난다.
타입이 달라서 비교가 불가능한 것이다.
2. 열거형의 정의와 사용
- 열거형을 정의하는 방법
enum 열거형이름 { 상수명1, 상수명2, ... }
//예
// 0 , 1 , 2 , 3
enum Direction { EAST, SOUTH, WEST, NORTH }
- 열거형 타입의 변수를 선언하고 사용하는 방법
class Unit {
int x, y; //유닛의 위치
Direction dir; //열거형 인스턴수 변수를 선언
void init() {
dir = Direction.EAST; //유닛의 방향을 EAST로 초기화
}
}
- 열거형 상수의 비교에 ==와 compareTo() 사용가능 (비교연산자 사용불가)
if(dir == Direction.EAST) {
x++;
} else if (dir > Direction.WEST) { //에러. 열거형 상수에 비교연산자 사용불가
...
} else if (dir.comapreTo(Direction.WEST) > 0) { //compareTo()는 가능
...
3. 열거형의 조상 - java.lang.Enum
- 모든 열거형은 Enum의 자손이며, 아래의 메서드를 상속받는다.
메서드 | 설명 |
Class<E> getDeclaringClass() | 열거형의 Class객체를 반환 |
String name() | 열거형 상수의 이름을 문자열로 반환 |
int ordinal() | 열거형 상수가 정의된 순서를 반환(0부터 시작) |
T valueOf(Class<T> enumType, String name) | 지정된 열거형에서 name과 일치하는 열거형 상수를 반환 |
- values(), valueOf()는 컴파일러가 자동으로 추가
static E[] values()
static E valueOf(String name)
Direction[] dArr = Direction.values();
for(Direction d : dArr) //for(Direction d : Direction.values())
System.out.printf("%s=%d%n", d.name(), d.ordinal());
Direction d = Direction.valueOf("WEST"); //Direction.WEST와 같다.
⍟실습
Ex12_5
더보기
package etc;
enum Direction { EAST, SOUTH, WEST, NORTH }
class Ex12_5 {
public static void main(String[] args) {
//주로 첫 번째를 많이 사용한다.
Direction d1 = Direction.EAST; //열거형타입.상수이름
Direction d2 = Direction.valueOf("WEST");
Direction d3 = Enum.valueOf(Direction.class, "EAST");
System.out.println("d1="+d1); //d1=EAST
System.out.println("d2="+d2); //d2=WEST
System.out.println("d3="+d3); //d3=EAST
System.out.println("d1==d2 ? "+ (d1==d2)); //d1==d2 ? false
System.out.println("d1==d3 ? "+ (d1==d3)); //d1==d3 ? true
System.out.println("d1.equals(d3) ? "+ d1.equals(d3)); //d1.equals(d3) ? true
// System.out.println("d2 > d3 ? "+ (d1 > d3)); // 에러
System.out.println("d1.compareTo(d3) ? "+ (d1.compareTo(d3))); //d1.compareTo(d3) ? 0
System.out.println("d1.compareTo(d2) ? "+ (d1.compareTo(d2))); //d1.compareTo(d2) ? -2
switch(d1) { //The direction is EAST.
case EAST: // Direction.EAST라고 쓸 수 없다.
System.out.println("The direction is EAST."); break;
case SOUTH:
System.out.println("The direction is SOUTH."); break;
case WEST:
System.out.println("The direction is WEST."); break;
case NORTH:
System.out.println("The direction is NORTH."); break;
default:
System.out.println("Invalid direction."); break;
}
Direction[] dArr = Direction.values();
for(Direction d : dArr) // for(Direction d : Direction.values())
System.out.printf("%s=%d%n", d.name(), d.ordinal());
}
}
enum은 하나의 값이라기보다는 하나의 객체이다. 그렇기 때문에 equals로 비교하는 것.
그래서 비교연산자를 사용하지 못하고 compareTo를 사용하는 것.
4. 열거형에 멤버 추가하기
- 불연속적인 열거형 상수의 경우, 원하는 값을 괄호()안에 적는다.
enum Direction {EAST(1), SOUTH(5), WEST(-1), NORTH(10) }
- 괄호()를 사용하려면, 인스턴스 변수와 생성자를 새로 추가해줘야 한다.
enum Direction {
EAST(1), SOUTH(5), WEST(-1), NORTH(10); //끝에 ';'를 추가해야 한다.
private final int value; //정수를 저장할 필드(인스턴스 변수)를 추가
Direction(int value) { this.value = value; } //생성자를 추가
public int getValue() {return value; }
}
- 열거형의 생성자는 묵시적으로 private이므로, 외부에서 객체생성 불가
Direction d = new Direction(1); //에러. 열거형의 생성자는 외부에서 호출불가
⍟실습
Ex12_6
더보기
package etc;
enum Direction2 {
//상수들이 값을 2개 가짐
EAST(1, ">"), SOUTH(2,"V"), WEST(3, "<"), NORTH(4,"^");
private static final Direction2[] DIR_ARR = Direction2.values();
private final int value;
private final String symbol;
Direction2(int value, String symbol) { // 접근 제어자 private이 생략됨
//생성자
this.value = value;
this.symbol = symbol;
}
public int getValue() { return value; }
public String getSymbol() { return symbol; }
public static Direction2 of(int dir) {//of라는 메서드
if (dir < 1 || dir > 4) // 0~3범위를 벗어나면 예외발생
throw new IllegalArgumentException("Invalid value :" + dir);
return DIR_ARR[dir - 1];
}
// 방향을 회전시키는 메서드. num의 값만큼 90도씩 시계방향으로 회전한다.
public Direction2 rotate(int num) {
num = num % 4;
if(num < 0) num +=4; // num이 음수일 때는 시계반대 방향으로 회전
return DIR_ARR[(value-1+num) % 4];
}
public String toString() {
return name()+getSymbol();
}
} // enum Direction2
class Ex12_6 {
public static void main(String[] args) {
for(Direction2 d : Direction2.values())
System.out.printf("%s=%d%n", d.name(), d.getValue());
Direction2 d1 = Direction2.EAST;
Direction2 d2 = Direction2.of(1);
System.out.printf("d1=%s, %d%n", d1.name(), d1.getValue());
System.out.printf("d2=%s, %d%n", d2.name(), d2.getValue());
System.out.println(Direction2.EAST.rotate(1));
System.out.println(Direction2.EAST.rotate(2));
System.out.println(Direction2.EAST.rotate(-1));
System.out.println(Direction2.EAST.rotate(-2));
}
}
출처
'🎥Back > 자바의 정석' 카테고리의 다른 글
[JAVA의 정석]예외발생시키기 (0) | 2024.02.28 |
---|---|
[JAVA의 정석] 프로그램오류. try-catch (0) | 2024.02.18 |
[JAVA의 정석]제네릭 형변환 (0) | 2024.01.19 |
[JAVA의 정석]와일드카드, 제네릭 메서드 (0) | 2024.01.19 |
[JAVA의 정석]Generics, Generics 클래스 (0) | 2024.01.18 |