어노테이션은 메타데이터를 제공하기 위해 자바 5에 추가되었으며, 컴파일러와 다양한 프레임워크가 사용할 수 있습니다. 초기에는 JUnit 또는 Hibernate와 같은 도구가 코드와 더 잘 상호작용할 수 있도록 도와주었으며, 반복적이거나 외부 설정을 작성할 필요 없이 사용할 수 있었습니다.
어노테이션은 클래스, 메서드, 필드, 매개변수 및 심지어 로컬 변수에 정보를 추가할 수 있습니다. 컴파일, 런타임 또는 소스 코드 처리가 진행되는 동안 유효성 검사, 추가 파일 생성 또는 프로그램의 행동 변경을 위해 사용될 수 있습니다.
자신의 어노테이션을 선언하기 위해 @interface 키워드를 사용합니다.
코드 예시:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value(); } class Example { @MyAnnotation("Test") public void annotatedMethod() {} }
주요 특징:
어노테이션은 오직 런타임에만 영향을 미칩니까?
아니요, 어노테이션은 소스 코드(SOURCE), 바이트 코드(CLASS)로 제한될 수 있거나, 실행 중에 (RUNTIME) 사용할 수 있습니다. 그들의 영향은 RetentionPolicy에 따라 달라집니다.
@Retention(RetentionPolicy.SOURCE) public @interface SourceOnly {}
어노테이션의 매개변수는 모든 타입이 될 수 있습니까?
아니요, 허용되는 타입은 원시값, 문자열, 열거형, 다른 어노테이션 및 이들 유형의 배열만 가능합니다. 객체는 사용할 수 없습니다.
어노테이션을 상속받을 수 있습니까?
엄밀히 말하면, 어노테이션은 클래스처럼 상속되지 않습니다. 단, @Inherited가 있는 어노테이션은 상속된 클래스에만 적용되며 (메서드에는 영향을 미치지 않음) 특별한 경우입니다.
대규모 프로젝트에서 한 개발자가 테스트 자동화를 위해 수십 개의 다양한 어노테이션을 생성했으나, 이를 명시적으로 작성하거나 문서화하지 않고, 범위를 제한하지 않았습니다. 그 결과 팀의 새로운 구성원이 어떤 어노테이션이 어디에서 작동하는지 이해하기 어려웠습니다.
장점:
단점:
팀에서는 자신의 어노테이션을 작성하기 위한 엄격한 전략을 도입했습니다: 필요한 것만 추가하고, 각각을 상세히 설명하고, 범위를 제한했습니다.
장점:
단점: