Java 주석 이해 – Java @annotations Tutorial
게시 됨: 2019-10-22
Java에서 주석은 어떻게 그리고 어디에 사용됩니까?
Java 컴퓨터 프로그래밍 언어에서 주석은 Java 소스 코드에 추가할 수 있는 특수한 형태의 구문 메타데이터입니다.
클래스, 메소드, 변수, 매개변수 및 패키지에 주석을 달 수 있습니다. Javadoc 태그와 달리 Java 주석은 컴파일러에 의해 생성된 클래스 파일에 포함될 수 있고 런타임에 검색 가능하도록 Java VM에 의해 유지될 수 있다는 점에서 반사적일 수 있습니다.
Java의 기존 주석에서 메타 주석을 만드는 것이 가능하므로 이 개념을 더욱 정교하게 만듭니다.
Java는 언어에 내장된 주석 세트를 정의합니다.

자바 코드에 적용된 주석:
- @Override – 함수가 재정의인지 확인합니다. 함수가 부모 클래스 중 하나에서 발견되지 않으면 컴파일 경고가 발생합니다.
- @Deprecated – 함수를 더 이상 사용되지 않는 것으로 표시합니다. 함수가 사용되면 컴파일 경고가 발생합니다.
- @SuppressWarnings – 주석 매개변수에 지정된 컴파일 시간 경고를 표시하지 않도록 컴파일러에 지시합니다.
다른 주석에 적용된 주석:
- @Retention – 표시된 주석이 저장되는 방식을 지정합니다. 즉, 코드에만 있는지, 클래스로 컴파일되는지, 또는 리플렉션을 통해 런타임에 사용할 수 있는지 여부를 지정합니다.
- @Documented – 문서에 포함할 다른 주석을 표시합니다.
- @Target – 주석을 적용할 수 있는 Java 요소의 종류를 제한하기 위해 다른 주석을 표시합니다.
- @Inherited – 다른 주석이 주석이 있는 클래스의 하위 클래스에 상속되도록 표시합니다(기본적으로 주석은 하위 클래스에 상속되지 않음).
샘플 예제를 통해 이를 살펴보겠습니다.
1) @Override 주석:
그 존재는 주석이 달린 메서드가 기존 슈퍼클래스 메서드를 재정의해야 함을 컴파일러에 나타냅니다.
@Override 의 가장 일반적인 사용 사례는 Object 메서드를 사용하는 것입니다.
1 2 3 4 |
@ Override public int hashValue ( ) { System . out . Println ( "This method is using @Override Annotation" ) ; } |
@Override 가 만들어진 주된 이유는 단순한 오타 를 처리하기 위해서였습니다.
예를 들어, 다음과 같이 잘못 선언된 메소드
1 |
public int hashvalue ( ) { . . . } |
실제로 재정의가 아닙니다 . 메서드 이름은 모두 소문자 이므로 hashValue() 메서드의 이름과 정확히 일치하지 않습니다. 그러나 완벽하게 잘 컴파일됩니다. 이러한 오류는 만들기 쉽고 포착하기 어려운 위험한 조합입니다. @Override 주석을 사용하면 이러한 오류를 방지할 수 있습니다.
슈퍼클래스 메서드를 재정의할 때마다 @Override 를 사용하는 습관을 가져야 합니다.

2) @Deprecated 주석:
이 주석은 표시된 요소가 더 이상 사용되지 않으며 더 이상 사용되지 않아야 함을 나타냅니다. 컴파일러는 프로그램이 @Deprecated
주석이 있는 메서드, 클래스 또는 필드를 사용할 때마다 경고를 생성합니다.
요소가 더 이상 사용되지 않는 경우 다음 예제와 같이 Javadoc @deprecated
태그를 사용하여 문서화해야 합니다.
1 2 3 4 |
< strong > @ Deprecated < / strong > static void deprecatedMethod ( ) { System . out . Println ( "This method is Deprecated.." ) ; } |
3) @SuppressWarnings 주석:
소리 지르지 말고 컴파일러에게 말하십시오. 내가 무엇을 하고 있는지 알아요.
1 2 3 4 |
@ SuppressWarnings ( "serial" ) public class OldCode implements Serializable { System . out . Println ( "This is Old Code.." ) ; } |
4) @Retention 주석:
보존 주석은 이 유형의 주석을 보존할 위치와 기간을 나타냅니다.
세 가지 값이 있습니다.
- RetentionPolicy.SOURCE - 이 유형의 주석은 소스 수준에서만 유지되며 컴파일러에서 무시됩니다.
- RetentionPolicy.CLASS - 이 유형의 주석은 컴파일 시 컴파일러에 의해 유지되지만 VM에서는 무시됩니다.
- RetentionPolicy.RUNTIME - 이 유형의 주석은 VM에서 유지되므로 런타임 시에만 읽을 수 있습니다.
1 2 3 4 |
@ Retention ( RetentionPolicy . RUNTIME ) public @ interface Crunchify_Retention { String returnSomething ( ) ; } |
5) @문서 주석:
1 2 3 4 |
@ Documented public @ interface Crunchify_Documented { String writeDocument ( ) ; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class DocumentedAnnotations { public static void main ( String arg [ ] ) { new DocumentedAnnotations ( ) . performRetention ( ) ; new DocumentedAnnotations ( ) . performDocumented ( ) ; } @ Crunchify_Retention ( returnSomething = "Hello retention test" ) public void performRetention ( ) { System . out . printf ( "Testing annotation 'Crunchify_Retention'" ) ; } @ Crunchify_Documented ( writeDocument = "Hello document" ) public void performDocumented ( ) { System . out . printf ( "Testing annotation 'Crunchify_Documented'" ) ; } } |
이제 Java Doc 명령을 실행하고 출력을 확인하십시오.

6) @Target 주석:
대상은 주석이 달린 주석 유형의 인스턴스를 사용하여 주석을 달 수 있는 프로그램 요소를 나타냅니다. Target의 값은 java.lang.annotation.ElementType
열거형의 멤버 중 하나입니다.
- ANNOTATION_TYPE. 주석이 달린 주석 유형은 주석 유형 선언에 주석을 추가하는 데 사용할 수 있습니다.
- 건설자. 주석이 달린 주석 유형을 사용하여 생성자 선언에 주석을 추가할 수 있습니다.
- 들. 주석이 달린 주석 유형을 사용하여 필드 선언에 주석을 추가할 수 있습니다.
- LOCAL_VARIABLE. 주석이 달린 주석 유형을 사용하여 지역 변수 선언에 주석을 달 수 있습니다.
- 방법. 어노테이션이 있는 어노테이션 유형은 메소드 선언에 어노테이션을 작성하는 데 사용할 수 있습니다.
- 패키지. 주석이 달린 주석 유형을 사용하여 패키지 선언에 주석을 추가할 수 있습니다.
- 매개변수. 주석이 달린 주석 유형을 사용하여 매개변수 선언에 주석을 추가할 수 있습니다.
- 유형. 주석이 달린 주석 유형은 유형 선언에 주석을 추가하는 데 사용할 수 있습니다.
1 2 3 4 |
@ Target ( value = METHOD ) You can have multiple values in the Target annotation . @ Target ( value = { TYPE , FIELD , METHOD , PARAMETER , CONSTRUCTOR , LOCAL_VARIABLE } ) |
7) @상속된 주석:
이름에서 알 수 있듯이 @Inherited
주석 유형은 주석 유형의 하위 클래스에 상속됩니다.
1 2 3 4 5 6 7 8 9 10 |
@ Inherited @ interface ForEveryone { } @ interface JustForMe { } @ ForEveryone @ JustForMe class Superclass { } class Subclass extends Superclass { } |
이 예제에서 Superclass
는 @ForEveryone
과 @JustForMe
로 명시적으로 주석을 달았습니다. Subclass
는 둘 중 하나로 명시적으로 표시되지 않았습니다. 그러나 후자는 @Inherited
주석이 달려 있기 때문에 @ForEveryone
을 상속합니다.
@JustForMe
는 주석 처리되지 않으므로 Subclass
에 상속되지 않습니다.
다음은 클래스 수준 주석입니다.
