JAVA

리플렉션 (어노테이션)

승운노트 2025. 10. 27. 09:50

어노테이션 (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 "";

 

 

핵심 개념

  1. 어노테이션은 @로 시작하는 '기계가 읽는 꼬리표'
  2. @interface 키워드로 정의
  3. @Retention(RUNTIME): 프로그램 실행 중에도 유지 (중요)
  4. @Target: 적용 대상 지정 (메서드, 클래스 등)
  5. 속성은 필수/선택으로 구분 (default 유무)