728x90
자바의 정석 챕터 13을 읽고 정리
1. 열거형이란?
- 열거형은 서로 관련된 상수를 편리하게 선언하기 위해 사용
- 자바의 열거형은 타입에 안전한 열거형
- 실제 값이 같아도 타입이 다르면 컴파일 에러 발생
class Card {
static final int HELLO = 0;
static final int WORLD = 1;
static final int HL = 0;
static final int WR = 1;
final int kind;
final int num;
}
// 열거형으로 표현
class Card {
enum Kind {
HELLO, WORLD
}
enum Value {
HL, WR
}
final Kind kind;
final Value value;
}
- 비교를 하면
if (Card.Kind.HELLO == Card.Value.HL) // 컴파일 에러. 값은 같지만 타입이 다르다.
2. 열거형의 정의와 사용
- 열거형은 위에서 선언한 것 처럼 열거형이름과 상수의 이름을 나열한다.
enum 열거형이름 { 상수1, 상수2, ... }
- 사용할 땐 '열거형이름.상수'로 사용
- 클래스의 static 변수 사용과 동일하다.
- 열거형 상수간의 비교는 '=='를 사용하기 때문에 equals()보다 성능이 좋다.
- '<', '>'는 사용할 수 없음 (대신 comapreTo() 사용 - 같을 경우 0 리턴, 왼쪽이 클 경우 양수 리턴, 오른쪽이 클 경우 음수 리턴)
enum Direction { EAST, WEST, SOUTH, NORTH }
class Unit {
int x, y;
Direction dir; // 열거형을 인스턴수 변수로 선언
void init() {
dir = Direction.EAST; // 유닛의 방향을 EAST로 초기화
}
if (dir == Direction.EAST) {
x++;
} else if (dir > Direction.WEST) {
// 에러. 비교연산자 사용 불가
} else if (dir.compareTo(Direction.WEST) > 0) {
...
}
}
- 열거형 Direction 모든 상수 출력 시
Direction[] dArr = Direction.values();
for (Direction d: dArr) System.out.println(d.name() + ", " + d.ordinal());
- name()은 값을 출력, ordinal()은 index 출력
728x90
3. 열거형에 멤버 추가하기
- 열거형의 상수를 직접 주고 싶으면 ()안에 넣어주면 된다.
enum Direction {
EAST(1), WEST(3), SOUTH(5), NORTH(8);
private final int value;
Direction (int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
열거형에 추상 메소드 추가하기
- 거리에 따라 요금이 달라지므로, 추상 메소드를 추가했음.
enum Transportation {
BUS(100) {
int fare (int distance) {
return distance * BASIC_FARE;
}
},
TRAIN(150) {
int fare (int distance) {
return distance * BASIC_FARE;
}
}
abstract int fare (int distance);
protected final int BASIC_FARE;
Transportation (int basicFare) {
BASIC_FARE = basicFare;
}
public int getBasicFare() {
return BASIC_FARE;
}
}
4. 열거형의 이해
- 열거형에서 상수 각각은 객체이다.
enum Direction { EAST, WEST }
// 클래스로 정의 시
class Direction {
static final Direction EAST = new Direction("EAST");
static final Direction WEST = new Direction("WEST");
private String name;
private Direction (String name) {
this.name = name;
}
}
- static 상수이기 때문에 '=='로 비교 가능하다.
728x90
'개발 > Java&Kotlin' 카테고리의 다른 글
[Java] 쓰레드(Thread)의 실행제어 (1) | 2022.09.15 |
---|---|
[Java] 쓰레드(Thread)의 기초 (1) | 2022.09.14 |
[Spring] 스프링시큐리티 OAuth2.0 적용해보기(Naver) (0) | 2022.09.02 |
[Spring] 스프링시큐리티 OAuth2.0 적용해보기(Facebook) (0) | 2022.09.01 |
[Spring] 스프링시큐리티 OAuth2.0 적용해보기(Google) (0) | 2022.08.31 |