어노테이션 (Annotation) - 기계가 읽는 꼬리표
코드에 // 로 다는 '주석'은 사람(동료 개발자나 미래의 자신)을 위한 것이다.
컴파일러는 주석을 그냥 무시하고 지나간다.
// 이 메서드는 로그인 처리합니다 <- 사람만 읽음
public void login() {
System.out.println("로그인!");
}
어노테이션이란?
어노테이션은 주석과 비슷하지만, '기계가 읽는' 특별한 주석이다.
@ 기호로 시작하는 이 '꼬리표'는 컴파일러나 JVM에게
"이 코드에 특별한 정보가 있으니 꼭 참고하라"고 알려주는 신호다.
@Override // <- 컴파일러가 읽음! "오버라이드가 맞는지 확인해라"
public void speak() {
System.out.println("멍멍");
}

실습 코드 1
package ex01;
import java.rmi.Naming;
// 주석과 어노테이션에 차이점을 살짝 알아 보자.
public class Animal {
void speak() {
System.out.println("...... Who? ......");
}
public static void main(String[] args) {
Animal animal = new Dog();
animal.speak();
}
}
// 개발자는 오버라이드 했다고 생각 함. 그런데 컴파일러는 그냥
// 다른 메서드라 인식을 하고 처리 했던 상황.
//@Override
class Dog extends Animal {
void speek() {
System.out.println("멍멍 ~~ ");
}
@Override
void speak() {
System.out.println("멍멍멍 ~@@!! ~~ ");
}
}
실습 코드 2
//package ex01;
//
//import java.util.List;
//
//// 스프링 부트에서 많이 사용하는 어노테이션 확인
//@Controller
//public class UserController {
//
// @GetMapping("/users")
// public List<User> getUsers{
// return ....;
// }
//}
실습 코드 3
package ex01;
// 직접 커스텀 어노테이션 만들어보기
// 1. interface 앞에 @ 가 있어야 한다.
// 2. 이 어노테이션 어디에 쓸 수 있을지 정의한다 (Target 설정)
// 3. 언제까지 유효할지 지정할 수 있다.
// 자바 파일 (.java) ---> .class(컴파일시점) ---> 런타임( Data Area )
// 4. 필요하다면 속성을 정의 할 수 있따.
// -- 필수 속성, 선택 속성
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// TYPE - (클래스나 인터페이스)
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestMappingHaHa {
String method();
String path();
String description() default ""; // 선택 속성
}
ElementType 종류
- 어디에 붙일지 지정
ElementType 적용 대상 스프링 예시
| TYPE | 클래스, 인터페이스 | @RestController |
| FIELD | 멤버 변수 | @Autowired |
| METHOD | 메서드 | @GetMapping |
| PARAMETER | 메서드 파라미터 | @RequestBody |
@Retention
- 어노테이션이 언제까지 유지되어야 하는가
정책 설명 사용 시점
| SOURCE | 소스 코드에만 존재. 컴파일하면 사라짐 | 컴파일 시점 체크용 |
| CLASS | .class 파일까지는 존재. 실행하면 사라짐 (기본값) | 빌드 도구용 |
| RUNTIME | 프로그램 실행 중에도 존재 | 실행 시점 동작용 |
어노테이션 속성의 종류
- 필수 유무
속성 종류 문법 특징 사용 예시
| 필수 속성 | 타입 이름(); | 기본값 없음. 반드시 값을 지정해야 함 | String method(); |
| 선택 속성 | 타입 이름() default 값; | 기본값 있음. 생략 가능 | String description() default ""; |
핵심 개념
- 어노테이션은 @로 시작하는 '기계가 읽는 꼬리표'
- @interface 키워드로 정의
- @Retention(RUNTIME): 프로그램 실행 중에도 유지 (중요)
- @Target: 적용 대상 지정 (메서드, 클래스 등)
- 속성은 필수/선택으로 구분 (default 유무)
'JAVA' 카테고리의 다른 글
| 리플렉션(동적 분석 도구 API) (0) | 2025.10.27 |
|---|---|
| 리플렉션(경직된 설계) (0) | 2025.10.27 |
| OCP (개방-폐쇄 원칙) (0) | 2025.10.15 |
| SRP (Single Responsibility Principle) - 단일 책임 원칙 (0) | 2025.10.15 |
| 객체 지향 설계 - S.O.L.I.D 원칙 (0) | 2025.10.15 |