[자바 라이브 스터디] 11주차 - Enum과 애노테이션
•
목표) 자바의 열거형과 애노테이션에 대해 학습하세요.
1. Enum
•
정의) 서로 관련된 상수를 편리하게 선언하기 위한 것
enum 열거형이름 { 상수명1, 상수명2 ... }
Java
복사
•
예시)
◦
enum 사용 x
class PreviousCard {
static final int CLOVER = 0;
static final int HEART = 1;
static final int DIAMOND = 2;
static final int SPADE = 3;
static final int BLACK = 0;
static final int RED = 1;
final int kind;
final int color;
}
Java
복사
◦
enum 사용 o
class Card {
enum Kind { CLOVER, HEART, DIAMOND, SPADE }
enum Color { BLACK, RED }
final Kind kind;
final Color color;
}
Java
복사
•
특징)
◦
JDK1.5부터 새로 추가됨
◦
타입에 안전한 열거형(typesafe eum)
▪
자바 Enum은 값뿐만 아니라 타입도 관리해서 논리적인 오류 줄일 수 있음
▪
값 같아도 타입이 다르면 컴파일 에러 발생
if(PreviousCard.CLOVER == PreviousCard.BLACK) // true. 실제론 타입이 달라서 서로 다른 값임
if(Card.Kind.CLOVER == Card.Color.BLACK) // 컴파일 에러. 타입 다르면 값 비교 안함
Java
복사
◦
상수와 달리 열거형 상수 사용 시, 상수 값이 바뀌어도 기존 소스 다시 컴파일할 필요 없음
◦
비교 시 ==, compareTo() 사용 가능. <, > 같은 비교 연산자 사용 불가능.
◦
switch문의 조건식에 사용할 때 열거형 이름은 적지 않고 상수 이름만 적어야 함
Direction dir = Direction.EAST;
switch(dir) { case EAST: break; case WEST: break; }
Java
복사
◦
java.lang.Enum
▪
모든 자바 열거체의 공통된 조상 클래스로 열거체를 조작하기 위한 다양한 메소드 가짐
▪
제공하는 메소드
메서드 | 설명 |
Class<E> getDeclaringClass() | 열거형의 Class객체 반환 |
String name() | 열거형 상수의 이름을 문자열로 반환 |
int ordinal() | 열거형 상수가 정의된 순서 반환(0부터 시작) |
T valueOf(Class<T> enumType, String name) | name과 일치하는 열거형 상수 반환 |
•
cf) 모든 열거체에 컴파일러가 자동으로 추가해 주는 메소드
◦
static E values() → 열거형의 모든 상수를 배열에 담아 반환
◦
static E valueOf(String name) → name과 일치하는 열거형 상수 반환
▪
예시)
Direction d = Direction.valueOf("WEST")
System.out.println(d); // WEST
System.out.println(Direction.WEST == d); // true
Direction[] dArr = Direction.values();
for(Direction d: dArr) {
System.out.print(d.name(), d.ordinal());
} // EAST1WEST2
Java
복사
2. 애노테이션
•
정의) 프로그램 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것
@interface 애너테이션이름 {
타입 요소이름();
}
Java
복사
•
특징)
◦
주석처럼 프로그래밍 언어에 영향 미치지 않으면서 다른 프로그램에게 유용한 정보 제공함
◦
JDK에서 제공하는 애너테이션은 java.lang.annotation 패키지에 포함되어 있음
◦
표준 애너테이션은 주로 컴파일러에게 유용한 정보 제공함
@Override | 컴파일러에게 오버라이딩하는 메서드라는 것을 알림 |
@Deprecated | 앞으로 사용하지 않을 것을 권장하는 대상에 붙임 |
@SuppressWarnings | 컴파일러의 특정 경고메시지가 나타나지 않게 해줌 |
@SafeVarargs | 지네릭스 타입의 가변인자에 사용함 |
@Functionallnterface | 함수형 인터페이스라는 것을 알림 |
@Native | native 메서드에서 참조되는 상수 앞에 붙임 |
◦
메타 에너테이션은 새로운 에너테이션 정의할 때 사용함
@Retention | 애너테이션이 유지되는 범위를 지정하는데 사용함 |
@Target | 애너테이션이 적용 가능한 대상을 지정하는데 사용함 |
@Documented | 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 함 |
@Inherited | 애너테이션이 자손 클래스에 상속되도록 함 |
@Repeatable | 애너테이션을 반복해서 적용할 수 있게 함 |
▪
@Retention
•
정의) 애너테이션이 유지되는 범위를 지정하는데 사용함
•
특징)
◦
유지 정책 종류
SOURCE | 소스 파일에만 존재. 클래스 파일에는 존재하지 않음 |
CLASS (default) | 클래스 파일에 존재. 실행 시에 사용 불가 |
RUNTIME | 클래스 파일에 존재. 실행 시에 사용 가능 |
▪
SOURCE → 컴파일러가 사용하는 대부분의 애너테이션의 유지 정책
▪
CLASS → 컴파일러가 애너테이션 정보를 클래스 파일에 저장할 순 있지만, 클래스 파일이 JVM에 로딩될 때 애너테이션 정보가 무시되어 실행 시에 사용 불가함
▪
RUNTIME → Reflection 통해 클래스 파일에 저장된 애너테이션 정보 읽어 처리 가능해짐
◦
지역 변수에 붙은 애너테이션은 컴파일러만 인식할 수 있어서 RUNTIME 유지정책인 애너테이션 붙여도 실행 시에 인식되지 않음
▪
@Target
•
정의) 애너테이션이 적용 가능한 대상을 지정하는데 사용함
•
예시) @Traget({TYPE, FILED})
•
특징)
◦
적용 대상의 종류
ANNOTATION_TYPE | 애너테이션 |
CONSTRUCTOR | 생성자 |
FIELD | 필드(멤버변수, enum 상수) |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE | 타입(클래스, 인터페이스, enum) |
TYPE_PARAMETER | 타입 매개변수 |
TYPE_USE | 타입이 사용되는 모든 곳 |
▪
@Documented
•
정의) 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 함
•
특징) 자바에서 제공하는 기본 애너테이션 중 @Override와 @SuppressWarnings를 제외하곤 모두 해당 어노테이션이 붙어 있음