[Java] 어노테이션(Annotation)이란? 개념과 특징, 주요 어노테이션 정리
by 우와한개발자
[ 어노테이션 Annotation]
1. 어노테이션이란?
- Java 5버전부터
- 코드에 메타데이터를 추가하는 방법 중 하나
- 클래스, 메서드, 변수 등에 대한 부가적인 정보 제공
- 어노테이션은 주석과 다르게 컴파일러나 프로그램 실행에 영향을 미치는 기능을 제공함
@Override
public void run() {} // 메서드 오버라이딩 틀리면 컴파일 에러 발생
@Transactional
public void save() {} // Spring이 읽고 자동으로 트랜잭션 시작(동작을 바꿈)
@Retention(RetentionPolicy.RUNTIME) // 어노테이션 언제까지 유지할지
@Target(ElementType.METHOD) // 이 어노테이션은 메서드에만 적용 가능
public @interface MyAnnotation{
String value() default "";
}
2. 어노테이션 생성 및 사용
// 어노테이션 정의
public @interface MyAnnotation {
// 어노테이션 요소 선언
String value();
int number() default 0; // 기본값을 가지는 어노테이션 요소
Class<?>[] classes(); // 배열 형태의 어노테이션 요소
}
//어노테이션 사용
@MyAnnotation(value = "Hello", number = 42,
classes = { MyClass1.class, MyClass2.class })
public class MyClass {
// 클래스 내용
}
3. 어노테이션 주요 용도
1) 컴파일 타임 정보 제공
- 소스 코드에 메타데이터를 추가하여 컴파일러에게 정보를 전 달
- 경고메세지 억제 또는 컴파일러가 코드 자동생성하도록 함.
2) 런타임 처리 지원
- 런타임에 어노테이션 정보를 읽고 처리
- 예를 들어 리플렉션(reflection)을 사용해 어노테이션이 적용된 요소를 검사하거나 동적으로 처리(Spring에서 많이 사용)
3) 소프트웨어 도구 지원
- 개발 도구나 프레임워크에서 어노테이션 활용해 코드 자동 생성 및 분석 가능
- 예를 들어 테스트 프레임워크는 @Test 어노테이션을 사용하여 테스트 메서드를 식별
⚠️ Java의 리플렉션 relfection
- 실행 중인 프로그램의 클래스, 인터페이스, 메서드, 필드 등과 같은 구조에 대한 정보를 동적으로 얻거나 조작하는 기능
즉, 정보를 검사하고, 클래스의 인스턴스 생성하고, 메서드 호출하고, 필드 값 읽거나 수정하는 등 작업을 수행하는 기능
- java.lang.reflect 패키지를 통해 제공
- 텍스트 클래스를 가지고 객체를 만들어준다던가, 바이트코드로 소스코드를 생성하는 디컴파일이 가능함.
4. 어노테이션 유지정책
- 어노테이션이 언제까지 유지되는지를 정의
- 주로 AOP에서 많이 사용됨.
⚠️ 관점지향 프로그래밍 AOP (Aspect Oriented Programming)
- 공통 관심사(Cross-Cutting Concern 횡적 관심사)를 핵심 로직에서 분리하는 것
- 그 전에는 핵심코드에서 공통코드를 불러서 사용해 중복이 많고 유지보수가 어려움.
구분 의미 핵심 코드 비즈니스 로직 공통 코드 로깅, 트랜잭션, 보안, 예외 처리
소스코드, 클래스 파일, 런타임 중 어디까지 유지될지를 결정함.
@Retention(RetentionPolicy.SOURCE)
@Retention(RetentionPolicy.CLASS)
@Retention(RetentionPolicy.RUNTIME)
1) SOURCE
- 소스 코드까지만 유지
- 컴파일 이후에는 소스코드에서 어노테이션 제거(주로 컴파일러에 추가 정보 전달 위함)
2) CLASS
- 클래스 파일까지 유지
- 어노테이션 정보가 제거
- 리플렉션(relfection)을 통해 클래스 파일에서 어노테이션 정보 조회 가능하나 실행중엔 불가.
3) RUNTIME
- 런타임까지 유지
- 어플리케이션 실행 중에도 어노테이션 정보가 유지
- 리플렉션(relfection)을 통해 런타임 시에도 어노테이션 정보 조회 가능
- 주로 커스텀 어노테이션 정의시 사용
5. 주요 어노테이션
1) Java 기본 어노테이션
| 어노테이션 | 설명 | @Retention |
| @Override | 메서드 재정의 명시 | SOURCE |
| @Deprecated | 사용 금지 표시 | RUNTIME |
| @SuppressWarnings | 경고 무시 | SOURCE |
| @FunctionalInterface | 함수형 인터페이스 명시 | RUNTIME |
| @SafeVarargs | 가변 인자 경고 억제 | SOURCE |
2) 메타 어노테이션 (어노테이션 위에 붙는 것)
| 어노테이션 | 설명 |
| @Target | 어디에 붙일 수 있는지 지정 |
| @Retention | 유지 범위 지정 (SOURCE / CLASS / RUNTIME) |
| @Documented | Javadoc 포함 여부 |
| @Inherited | 상속 허용 |
3) Lombok 어노테이션
| 어노테이션 | 설명 |
| @Getter, @Setter | getter/setter 자동 생성 |
| @ToString | toString 자동 생성 |
| @EqualsAndHashCode | equals/hashCode 생성 |
| @NoArgsConstructor | 기본 생성자 |
| @AllArgsConstructor | 모든 필드 생성자 |
| @RequiredArgsConstructor | final 필드 생성자 |
| @Builder | 빌더 패턴 |
| @Data | 위 대부분 묶음 |
| @Slf4j | 로그 객체 생성 |
'언어 > Java' 카테고리의 다른 글
| [Java] 내부 클래스(nested Class)와 익명 클래스(Anonymous Class) (0) | 2026.03.03 |
|---|---|
| [Java] 주요 어노테이션 정리 - Java, Lombok, Spring, JPA (0) | 2026.03.03 |
| [Java] 스트림(Stream)이란? 개념과 주요 메서드, 직렬/병렬 스트림 (0) | 2026.03.03 |
| [Java] 람다표현식(Lambda Expression) / 함수형 인터페이스 / 메서드 참조 연산(::) (0) | 2026.03.03 |
| [Java] 예외(Exception) - try catch문, throws, throw , 예외 종류 (0) | 2026.03.02 |
블로그의 정보
우와한개발자 님의 블로그
우와한개발자