BE/Java

[Java] 어노테이션

baek-dev 2024. 12. 11. 18:46

어노테이션은 메타데이터를 제공하는 특별한 형태의 문법

주로 컴파일러 지시, 런타임 동작제어, 문서화 등에 사용된다

 

특징

  1. 메타데이터 제공
    코드에 부가적인 정보를 포함하지만 프로그램의 로직에는 직접적인 영향을 미치지 않는다
  2. 주석과는 다름
    주석은 개발자를 위한 설명일뿐이지만, 컴파일러나 런타임 환경에서 사용된다
  3. 클래스, 메소드, 필드, 매개변수 등 다양한 위치에 적용 가능
    클래스, 메서드, 변수, 생성자, 매개변수, 패키지 선언 등 여러 곳에 사용할 수 있다

기본문법

`@`기호로 시작한다

@AnnotationName
public class Main{}
  • 어노테이션 정의
@interface 어노테이션이름 {}
  • 어노테이션 사용
@어노테이션이름
public class MyClass {
    // 클래스 내용
}

자바에서 제공하는 기본 어노테이션

1. 컴파일러 지시용

  • `@Override` - 메소드가 부모 클래스의 메소드를 재정의하고 있다는 것을 명시
@Override
public String toString() {
	return "MyClass";
}
  • `@Deprecated` - 해당 요소가 더이상 사용되지 않음을 의미
@Deprecated
public void oldMethod() {
	System.out.println("This method is deprecated.");
}
  • `@SuppressWarnings` - 컴파일러 경고를 무시한다
@SuppressWarnings("unchecked")
List rawList = new ArrayList();

2. 런타임 처리용

  • `@Retention` - 어노테이션의 유지 정책을 정의합니다.
    • `SOURSE` : 컴파일 시 제거
    • `CLASS` : 클래스 파일에 포함되지만 런타임에는 사용 불가
    • `RUNTIME` : 런타임에도 유지 (리플렉션으로 접근 가능)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value();
}
  • `@Target` - 어노테이션을 적용할 위치를 제한합니다
    • ElementType.TYPE - 클래스
    • ElementType.METHOD - 메서드
    • ElementType.FIELD - 필드
@Target(ElementType.METHOD)
public @interface MyAnnotation {
}
  • `@Document` - 어노테이션이 JavaDoc에 포함되도록 설정함
@Documented
public @interface MyAnnotation {}
  • `@Inherited` - 자식 클래스에 상속되도록 지정
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {}

3. 마커 어노테이션

값이나 매개변수를 가지지 않는 어노테이션 (`@Override`)


커스텀 어노테이션 만들기

개발자는 자신만의 어노테이션을 정의할수 있다

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    String value() default "default";
}
public class Test {
    @MyAnnotation(value = "Hello")
    public void myMethod() {
        System.out.println("My method!");
    }
}

어노테이션의 활용

1. 프레임워크

  • Spring : `@Controller`, `@Service`, `@Autowired` 등
  • JPA : `@Entity`, `@Table`, `@Id` 등

2. 런타임 리플렉션

리플렉션을 사용하여 어노테이션을 읽고 동적으로 행동을 정의할 수 있다

Method method = Test.class.getMethod("myMethod");
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
System.out.println(annotation.value());

어노테이션의 장점

  • 코드 가독성 및 유지보수성 향상
  • 반복적인 코드 제거
  • 메타데이터 기반의 동적 처리 가능

어노테이션의 단점

  • 과도하게 사용하면 코드가 복잡해질 수 있음
  • 런타임 처리 시 성능 저하 가능

어노테이션은 자바 개발에서 필수적으로 이해하고 활용해야 할 강력한 도구입니다.

 


 

 

 

출처 : ChatGPT

'BE > Java' 카테고리의 다른 글

[Java] 레이어드 아키텍처와 mvc  (1) 2024.12.15
[Java] 명령형 , 선언형 프로그래밍  (0) 2024.12.12
[Java] JDBC와 JPA  (0) 2024.12.11
[Java] 람다식  (0) 2024.12.10
[Java] 스트림  (1) 2024.12.09