Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- dynamic programming
- Binary Search
- Data Structure
- SQL
- Stack
- 파이썬
- hash table
- geometry
- Matrix
- two pointers
- 구현
- Binary Tree
- sorting
- string
- java
- Math
- Class
- Method
- implement
- greedy
- Number Theory
- Counting
- 코딩테스트
- 코테
- database
- simulation
- 자바
- array
- bit manipulation
- Tree
Archives
- Today
- Total
코린이의 소소한 공부노트
열거형(enum, enumerated type) 본문
[열거형]
1. 관련된 상수들을 같이 묶어 놓는 것
2. 자바는 타입에 안전한 열거형을 제공한다.
- 타입에 안전하다는 것은 값과 타입을 동시에 체크한다는 것을 말한다.
// 열거형을 쓰지 않았을 때 // 열거형을 쓸 때
class Card1{ class Card2{
// 무늬 // 무늬 0 1 2 3
static final int CLOVER = 0; enum Kind { CLOVER, HEART, DIAMOND, SPADE }
static final int HEART = 1 // 열거형 Kind 정의
static final int DIAMOND = 2;
static final int SPADE = 3;
// 숫자 // 숫자 0 1 2
static final int TWO = 0; enum Value { TWO, THREE, FOUR }
static final int THREE = 1; // 열거형 Value 정의
static final int FOUR = 2;
// iv // iv
final int kind; final Kind kind; // 타입이 int가 아닌 Kind
final int num; final Value value;
} }
Card1.CLOVER == Card1.TWO // true
// 무늬와 숫자는 다르기 때문에 의미상 false로 나와야 한다.
Card2.Kind.CLOVER == Card2.Value.TWO // 에러. 타입이 달라서 비교 불가
// 이게 우리가 원하는 방향의 결과다.
[열거형 정의하기]
1. enum 열거형이름 { 상수명1, 상수명2, ... } 형태로 정의해주면 된다.
enum Direction { EAST, SOUTH, WEST, NORTH } // EAST부터 0, 1, 2, 3
class Unit{
int x, y; // 유닛의 위치
Direction dir; // 열거형을 iv로 선언
void init() { dir = Direction.EAST; } // 유닛의 방향을 EAST로 초기화
}
2. 열거형 상수를 비교할 때 ==와 compareTo()를 사용할 수 있다.
if(dir==Direction.EAST) { } // OK
else if(dir>Direction.WEST) { } // 에러. 비교 연산자는 사용 불가. 이유는 맨 아래에
else if(dir.compareTo(Direction.WEST)>0) { } // OK
[java.lang.Enum 클래스]
1. 모든 열거형의 조상 클래스이다.
2. Enum 클래스의 메서드
// 1) 기본 메서드
Class<E> getDeclaringClass()
// 열거형의 Class 객체를 반환한다.
String name()
// 열거형 상수의 이름을 문자열로 반환한다.
int ordinal()
// 열거형 상수가 정의된 순서를 반환한다. (0부터 시작)
// 실제 상수가 갖는 값과는 차이가 있을 수도 있다.
T valueOf(Class<T> enumType, String name)
// 지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다.
// 2) 컴파일러가 자동적으로 추가해주는 메서드
static E values()
static E valueOf(String name)
// 사용 예시
Direction[] dArr = Direction.values();
for(Direction d : dArr)
System.out.printf(“%s=%d, ”, d.name(). d.ordinal()); // EAST=0, SOUTH=1, WEST=2, NORTH=3
Direction d = Direction.valueOf(“WEST”); // d = Direction.WEST
Direction d = Enum.valueOf(Direction.class, “EAST”); // 윗줄과 동일
[열거형에 멤버 추가하기]
1. 불연속적인 열거형 상수의 경우 원하는 값을 괄호() 안에 적는다.
enum Direction { EAST(1), SOUTE{5}, WEST(-1), NORTH(10) }
// ordinal()을 호출하면 0, 1, 2, 3이 된다.
enum Direction2 { EAST(1, ">"), SOUTH(2,"v"), WEST(3, "<"), NORTH(4,"^"); }
// ()안에 여러 값을 넣을 수도 있다.
2. 괄호를 사용하려면 iv와 생성자를 새로 추가해줘야 한다. 이때 괄호 안에 넣은 값의 개수만큼 iv를 추가해야 한다.
enum Direction { // 괄호 안의 값이 1개
EAST(1), SOUTE{5}, WEST(-1), NORTH(10); // 끝에 ;를 추가해야 한다.
private final int value; // 정수를 저장할 필드(iv) 추가
Direction(int value) { this.value = value; } // 생성자 추가
public int getValue() { return value; }
}
enum Direction2 { // 괄호 안의 값이 2개
EAST(1, ">"), SOUTH(2,"v"), WEST(3, "<"), NORTH(4,"^");
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; }
}
3. 열거형의 생성자는 묵시적으로 private이므로 외부에서 객체 생성이 불가하다.
Direction d = new Direction(1); // 에러
[열거형의 이해]
enum Direction { EAST, SOUTE, WEST, NORTH }
- 열거형 Direction위 위와 같이 선언되어 있는 것은 아래와 같은 클래스로 선언된 것과 유사하다.
class Direction{
static final Direction EAST = new Direction(“EAST”);
static final Direction SOUTH = new Direction(“SOUTH”);
static final Direction WEST = new Direction(“WEST”);
static final Direction NORTH = new Direction(“NORTH”);
private String name;
private Direction(String name) { this.name = name; }
}
// 열거형 상수는 객체이기 때문에 비교 연산자 사용이 불가능하다!
'Java' 카테고리의 다른 글
애너테이션 만들기 (0) | 2022.11.21 |
---|---|
애너테이션의 정의와 종류 (0) | 2022.11.17 |
지네릭 타입의 형변환과 제거 (0) | 2022.11.14 |
와일드카드 ?와 지네릭 메서드 (0) | 2022.11.14 |
지네릭 클래스의 예시와 제한 (0) | 2022.11.14 |