2005년 Java 5가 등장하면서 우리는 주석이라는 새로운 엔티티를 알게 되었습니다.

주석은 코드에서 선언할 수 있는 특수한 형태의 구문 메타데이터입니다. 컴파일 또는 런타임에 코드를 분석하는 데 사용됩니다. 주석은 레이블, 태그 또는 컴파일러 힌트로 생각할 수 있습니다.

이전에 주석을 본 적이 있을 것입니다. 예를 들어 부모 클래스의 메서드를 재정의할 때 메서드 자체 앞에 @Override를 씁니다 . 이 주석은 부모의 메서드가 자식 클래스에서 재정의됨을 나타냅니다.

통사론:


@Override
public int hashCode() {
      return super.hashCode();
}

주석이 메서드에만 적용되는 것은 아니라는 점을 즉시 주목하고 싶습니다. 패키지, 클래스, 메소드, 필드 및 매개변수와 함께 사용됩니다.

주석이 작동하는 방식을 이해하려면 먼저 마커 인터페이스의 개념에 익숙해져야 합니다. Java가 등장한 이후로 개발자는 항상 특정 작업을 수행하기 위해 클래스를 표시하는 방법이 필요했습니다.

Java 5 이전에는 우리가 기대하는 인터페이스를 수행하지 않는 인터페이스를 사용했습니다. 방법도 계약도 없었습니다. 어떤 식으로든 클래스를 특별하게 표시했을 뿐입니다.

이러한 인터페이스를 마커 인터페이스라고 합니다. 이름에서 그 목적이 JVM, 컴파일러 또는 일부 라이브러리에 대한 클래스를 표시하는 것임을 짐작할 수 있습니다. Serializable 과 같은 일부 마커 인터페이스는 남아 있습니다. 이 마커 인터페이스를 사용하면 클래스의 인스턴스를 직렬화할 수 있음을 나타낼 수 있습니다.

우리가 본 것처럼 마커 인터페이스는 주석이 도입된 후에도 계속 유지됩니다.

주석 대 마커 인터페이스:


@MyAnnotation
public class MyClass {}

public class MyClass implements MarkerInterface {}

두 접근 방식은 동일한 목표를 가지고 있지만 구현에는 분명한 차이가 있습니다. 예를 들어 클래스가 특정 유형에 속함을 나타내는 인터페이스와 주석을 고려하십시오.

인터페이스를 사용하는 경우 클래스를 표시합니다. 잘못 사용하여 오류가 발생하면 컴파일 시 문제를 발견하고 프로그램이 실행되지 않습니다.

주석을 사용하면 모든 것이 그렇게 간단하지 않습니다. 여기에서 런타임에 오류가 감지됩니다. 즉, 프로그램이 시작되지만 당연히 완료되지는 않습니다.

나중에 사용할 클래스를 표시해야 하는 경우 해당 인스턴스를 특정 메서드에 전달해야 합니다.


public class MyInteger implements Sum {}
interface Sum {};

public static void main(String[] args) throws IOException {
        increase(new MyInteger());
}
 
public static void increase(Sum count) {
        // TODO
}

마커 인터페이스는 여기에서 가장 잘 작동합니다.

주석이 지원하는 매개변수와 같이 더 필요한 것이 있을 때 주석을 사용하는 것이 가장 좋습니다.

JDK의 표준 주석을 살펴보겠습니다.

주석 설명
@우세하다 메서드가 슈퍼클래스의 메서드를 재정의하거나 추상 클래스 또는 인터페이스의 메서드를 구현하도록 지정합니다.

@Override
public int hashCode() {
        return super.hashCode();
}
@비추천 코드를 더 이상 사용되지 않는 것으로 표시합니다.

@Deprecated
public abstract void method();
@SuppressWarnings 주석이 달린 요소에 대한 컴파일러 경고를 비활성화합니다. 여러 범주의 경고를 비활성화해야 하는 경우 @SuppressWarnings({"unchecked", "cast"}) 와 같이 중괄호로 묶어야 합니다 .

public class DocumentsFolder {
   private List documents;

   @SuppressWarnings("unchecked")
public void addDocument(String document) {
            documents.add(document);
   }
}

이 예제에서는 정의된 유형(제네릭 유형)이 없는 목록에 추가하려고 합니다. 컴파일러는 이에 대해 경고합니다. 이는 매우 유용하지만 때때로 "경고"가 너무 많아 시끄러울 수 있습니다. 이 메서드 주석을 사용하고 컴파일러 경고 유형을 인수로 지정할 수 있습니다. 많은 마커가 있으므로 모두 기억하는 것에 대해 걱정하지 마십시오. IDEA는 일반적으로 추가할 마커를 알려줍니다.

여러 인수가 있는 또 다른 예:


@SuppressWarnings({"unchecked", "deprecated"})