프로그래밍백엔드 개발자

자바에서 애너테이션 지원이 어떻게 구현되어 있으며 사용자 정의 애너테이션을 어떻게 생성합니까? 실제로 올바르게 사용하는 방법은 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

질문 이력:

애너테이션은 자바 5에서 프로그램의 논리를 변경하지 않고 바이트 코드에 메타 정보를 추가하기 위해 등장했습니다. 애너테이션을 사용하면 프레임워크, 컴파일러 또는 파서에 추가 정보를 쉽게 제공할 수 있습니다.

문제:

잘못 설계되거나 잘못 사용된 애너테이션은 코드 유지 관리를 복잡하게 만듭니다. 때때로 개발자는 애너테이션의 적용 가능성을 혼동하거나 자신만의 애너테이션을 만드는 방법을 이해하지 못하며, 애너테이션에 매개변수를 추가할 수 있는 가능성에 대해 알지 못합니다.

해결책:

자체 애너테이션 만들기:

import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyTest { String value() default ""; }

애너테이션 사용:

public class TestClass { @MyTest("Example") public void testMethod() {...} }

주요 특징:

  • 애너테이션은 기본값과 함께 매개변수를 가질 수 있습니다.
  • 애너테이션은 메타 애너테이션 @Target 및 @Retention으로 제공되어야 합니다.
  • Runtime Retention을 사용하면 Reflection을 통해 애너테이션을 사용할 수 있습니다.

숨겨진 질문들.

애너테이션은 다른 애너테이션을 상속할 수 있습니까?

답변: 아니요, 자바의 애너테이션은 서로 상속을 지원하지 않습니다.

클래스의 모든 자식들에게 애너테이션 작업을 의무화할 수 있습니까?

답변: 직접적으로는 불가능합니다. 추가적인 확인을 위해 리플렉션을 사용하여 애너테이션의 존재를 수동으로 체크해야 합니다.

@Retention(Class)와 @Retention(RUNTIME)의 차이점은 무엇입니까?

답변:

  • @Retention(RUNTIME): 애너테이션은 리플렉션을 통해 실행 중에 접근할 수 있습니다.
  • @Retention(CLASS): 애너테이션은 바이트 코드에 저장되지만 리플렉션을 통해 접근할 수 없습니다 (컴파일러만 사용).

일반적인 오류 및 안티 패턴

  • 자신의 애너테이션에 대해 @Target 및 @Retention을 지정하지 않음
  • 애너테이션을 올바른 용도로 사용하지 않음 (예: 잘못된 도구로 처리하거나 의도된 환경 외부에서 사용).

실생활 예시

부정적인 사례

프로젝트에서 XML 구성을 애너테이션으로 변경하려고 했지만 @Retention(RUNTIME)을 추가하지 않았습니다.

장점:

  • 코드가 더 간결하게 보입니다.

단점:

  • 애너테이션이 런타임에서 보이지 않아서 프레임워크가 이를 처리할 수 없습니다.

긍정적인 사례

서버에서 실제 논리 호출을 추적하는 비즈니스 운영 감사를 관리하는 사용자 정의 애너테이션 @Audit를 방법에 설정했습니다.

장점:

  • 중앙 집중식의 투명한 감사

단점:

  • 애너테이션 처리는 약간의 런타임 오버헤드와 잘 설계된 루프 예외 처리를 요구합니다.