다시 하자 기초! 열거형과 어노테이션
열거형이란?
JDK1.5부터 새로 추가된 기능인데 C언어의 열거형보다 더 향상된 것으로 열거형이 갖는 값뿐만 아니라 타입까지 관리하기 때문에 보다 논리적인 오류를 줄일 수 있다.
class Card {
static final int CLOVER = 0;
static final int HEART = 1;
static final int DIAMOND = 2;
static final int SPADE = 3;
static final int TWO = 0;
static final int THREE = 1;
static final int FOUR = 2;
final int kind;
final int num;
}
↓
class Card {
enum Kind { CLOVER, HEART, DIAMOND, SPADE }; //열거형 Kind를 정의
enum Value { TWO, THERR, FOUR }; //열거형 Value를 정의
final Kind kind; //타입이 int가 아닌 Kind임에 유의하자.
final Value value;
기존의 많은 언어들, 예를 들어 C언어는 타입이 달라도 값이 같으면 조건식이 참이였지만 자바의 '타입에 안전한 열거형'에서는 실제 값이 같아도 타입이 다르면 조건의 결과가 false가 된다. 이처럼 값뿐만 아니라 타입까지 체크하기 때문에 타입에 안전하다고 하는 것이다.
그리고 더 중요한 점은 상수의 값이 바뀌면 해당 상수를 참조하는 모든 소스를 다시 컴파일 해야한다는 것인데 열거형 상수를 이용하면 기존의 소스를 다시 컴파일 하지 않아도 된다.
열거형의 정의와 사용
열거형을 정의하는 방법은 간단하다. 다음과 같이 괄호안에 상수의 이름을 나열하기만 하면된다.
enum 열거형이름 { 상수명1, 상수명2, ... }
enum Direction { EAST, SOUTH, WEST, NORTH }
이 열거형에 정의된 상수를 사용하는 방법은 '열거형이름.상수명' 이다. 클래스의 static변수를 참조와 동일.
class Unit {
int x, y; //유닛의 위치
Direction dir; //열거형을 인스턴스 변수로 선언
void init() {
dir = Direction.EAST; //유닛의 방향을 EAST로 초기화
}
}
열거형 상수간의 비교에는 ==를 사용할 수 있다. equals()를 사용안하고 비교가 된다는 것은 그 만큼 속도가 빠르다는 것이다. 그러나 '<'나 '>'와 같은 비교연산자는 사용불가하고 compareTo()는 사용이 가능하다.
열거형 Direction에 정의된 모든 상수를 출력하려면, 다음과 같이 해야한다.
Direction[] dArr = Direction.values();
for(Direction d : dArr)
System.out.print("%s=%d%n", d.name(), d.ordinal());
values()는 열거형의 모든 상수를 배열에 담아 반환한다.
메서드 | 설명 |
Class<E> getDeclaringClass() | 열거형의 모든 Class객체를 반환한다. |
String name() | 열거형 상수의 이름을 문자열로 반환한다. |
int ordinal() | 열거형 상수가 정의된 순서를 반환한다. (0부터 시작) |
T valueOf(Class<T> enumType, String name) | 지정된 열거형에서 name과 일치하는 열거형 상수를 반환 |
열거형에 멤버추가 하기
Enum클래스에 정의된 ordinal()이 열거형 상수가 정의된 순서를 반환하지만, 이 값을 열거형 상수의 값으로 사용하지 않는 것이 좋다. 이 값은 내부적인 용도로만 사용되기 위한 것이기 때문이다.
열거형 상수의 값이 불연속적인 경우에는 이때는 다음과 같이 열거형 상수의 이름옆에 원하는 값을 괄호()와 함께 적어주면된다. 그리고 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해 줘야한다.
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; }
}
열거형의 인스턴스 변수는 반드시 final이여야 하는 제약은 없지만 value는 열거형 상수의 값을 저장하기 위한 것이므로 final을 붙였다. 그리고 외부에서 값을 얻을 수 있게 getValue()도 추가했다.
열거형 Direction에 새로운 생성자가 추가되었지만, 위와 같이 열거형의 객체를 생성할 수 없다. 열거형의 생성자는 제어자가 묵시적으로 private이기 때문이다.
또한 열거형에 추상 메서드를 추가할 수 있다. 추상 메서드를 선언하면 각 열거형 상수가 이 추상 메서드를 반드시 구현해야한다.
어노테이션(annotation) - 주석, 주해, 메모의 뜻이 있다.
자바를 개발한 사람들은 소스코드에 대한 문서를 따로 만들기보다 소스코드와 문서를 하나의 파일로 관리하는 것이 낫다고 생각했다. 그래서 소스코드의 주석 /* */에 소스코드에 대한 정보를 저장하고, 소스코드의 주석으로부터 HTML문서를 생성해내는 프로그램을 만들어서 사용했다.
프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것이 바로 어노테이션이다. 주석처럼 프로그래밍 언어에 영향을 미치지 않으면서도 다른 프로그램에게 유용한 정보를 제공해주는 장점이 있다.