전체 보기

[백기선 자바] Enum과 애노테이션

작성일자
2023/08/13
태그
SUB PAGE
프로젝트
백기선 자바
책 종류
1 more property

[자바 라이브 스터디] 11주차 - Enum과 애노테이션

목표) 자바의 열거형과 애노테이션에 대해 학습하세요.
11
issues

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를 제외하곤 모두 해당 어노테이션이 붙어 있음