웹사이트 검색

자바 주석


Java 주석은 코드에 대한 정보를 제공합니다. Java 주석은 주석이 달린 코드에 직접적인 영향을 미치지 않습니다. 자바 주석 자습서에서는 다음을 살펴보겠습니다.

  1. 내장 Java 주석
  2. 맞춤 주석 작성 방법
  3. 주석 사용법 및 Reflection API를 사용하여 주석을 파싱하는 방법

자바 주석

자바 커스텀 어노테이션

사용자 지정 주석을 만드는 것은 interface 키워드 앞에 _@_ 기호가 붙는다는 점을 제외하면 인터페이스를 작성하는 것과 비슷합니다. 주석에서 메서드를 선언할 수 있습니다. 자바 커스텀 어노테이션 예제를 보고 그 기능과 중요한 포인트에 대해 논의해 봅시다.

package com.journaldev.annotations;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo{
	String author() default "Pankaj";
	String date();
	int revision() default 1;
	String comments();
}

Java 주석에 대한 몇 가지 중요한 사항은 다음과 같습니다.

  1. 주석 메서드는 매개변수를 가질 수 없습니다.
  2. 주석 메서드 반환 유형은 프리미티브, 문자열, 열거형, 주석 또는 이들의 배열로 제한됩니다.
  3. 자바 주석 메서드는 기본값을 가질 수 있습니다.
  4. 주석에는 메타 주석이 첨부될 수 있습니다. 메타 주석은 주석에 대한 정보를 제공하는 데 사용됩니다.

자바의 메타 주석

다섯 가지 유형의 메타 주석이 있습니다.

  1. @Documented - 이 주석을 사용하는 요소가 javadoc 및 유사한 도구로 문서화되어야 함을 나타냅니다. 이 유형은 해당 주석이 클라이언트의 주석 요소 사용에 영향을 미치는 유형의 선언에 주석을 추가하는 데 사용해야 합니다. 유형 선언에 Documented로 주석이 달린 경우 해당 주석은 주석이 달린 요소의 공개 API의 일부가 됩니다.
  2. @Target - 주석 유형을 적용할 수 있는 프로그램 요소의 종류를 나타냅니다. 일부 가능한 값은 TYPE, METHOD, CONSTRUCTOR, FIELD 등입니다. 대상 메타 주석이 없으면 모든 프로그램 요소에서 주석을 사용할 수 있습니다.
  3. @Inherited - 주석 유형이 자동으로 상속됨을 나타냅니다. 사용자가 클래스 선언에서 주석 유형을 쿼리하고 클래스 선언에 이 유형에 대한 주석이 없으면 주석 유형에 대해 클래스의 슈퍼클래스가 자동으로 쿼리됩니다. 이 프로세스는 이 유형에 대한 주석을 찾거나 클래스 계층 구조(객체)의 최상위에 도달할 때까지 반복됩니다.
  4. @Retention - 주석이 달린 유형의 주석이 유지되는 기간을 나타냅니다. 가능한 값이 SOURCE, CLASS 및 RUNTIME인 RetentionPolicy 인수를 사용합니다.
  5. @Repeatable - 선언에 주석을 추가하는 주석 유형이 반복 가능함을 나타내는 데 사용됩니다.

Java의 기본 제공 주석

Java 5개의 내장 주석을 제공합니다.

  1. @Override - Superclass의 메서드를 재정의하려는 경우 이 주석을 사용하여 메서드를 재정의하고 있음을 컴파일러에 알려야 합니다. 따라서 상위 클래스 메서드가 제거되거나 변경되면 컴파일러에서 오류 메시지를 표시합니다. 메서드를 재정의하는 동안 항상 자바 재정의 주석을 사용해야 하는 이유를 알아보세요.
  2. @Deprecated - 컴파일러가 메소드가 더 이상 사용되지 않는다는 것을 알기를 원할 때 이 주석을 사용해야 합니다. Java는 javadoc에서 이 메서드가 더 이상 사용되지 않는 이유와 사용할 대안이 무엇인지에 대한 정보를 제공해야 한다고 권장합니다.
  3. @SuppressWarnings - 컴파일러가 생성하는 특정 경고를 무시하도록 컴파일러에 지시하기 위한 것입니다(예: Java 제네릭에서 원시 유형 사용). 보존 정책은 SOURCE이며 컴파일러에서 폐기됩니다.
  4. @FunctionalInterface - 이 주석은 기능 인터페이스에 도입되었습니다.
  5. @SafeVarargs - 주석이 달린 메서드 또는 생성자의 본문이 varargs 매개 변수에서 잠재적으로 안전하지 않은 작업을 수행하지 않는다는 프로그래머 주장.

Java 주석 예제

위의 예에서 우리가 만든 사용자 지정 주석의 사용뿐만 아니라 Java의 내장 주석 사용을 보여주는 Java 예를 살펴보겠습니다.

package com.journaldev.annotations;

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

public class AnnotationExample {

	public static void main(String[] args) {
	}

	@Override
	@MethodInfo(author = "Pankaj", comments = "Main method", date = "Nov 17 2012", revision = 1)
	public String toString() {
		return "Overriden toString method";
	}

	@Deprecated
	@MethodInfo(comments = "deprecated method", date = "Nov 17 2012")
	public static void oldMethod() {
		System.out.println("old method, don't use it.");
	}

	@SuppressWarnings({ "unchecked", "deprecation" })
	@MethodInfo(author = "Pankaj", comments = "Main method", date = "Nov 17 2012", revision = 10)
	public static void genericsTest() throws FileNotFoundException {
		List l = new ArrayList();
		l.add("abc");
		oldMethod();
	}

}

위의 자바 주석 예제는 자명하고 다른 경우에 주석을 사용하는 것을 보여줍니다.

Java 주석 구문 분석

Reflection을 사용하여 클래스에서 Java 주석을 구문 분석합니다. 주석 보존 정책은 RUNTIME이어야 합니다. 그렇지 않으면 해당 정보는 런타임에 사용할 수 없으며 여기에서 데이터를 가져올 수 없습니다.

package com.journaldev.annotations;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class AnnotationParsing {

	public static void main(String[] args) {
		try {
			for (Method method : AnnotationParsing.class.getClassLoader()
					.loadClass(("com.journaldev.annotations.AnnotationExample")).getMethods()) {
				// checks if MethodInfo annotation is present for the method
				if (method.isAnnotationPresent(com.journaldev.annotations.MethodInfo.class)) {
					try {
						// iterates all the annotations available in the method
						for (Annotation anno : method.getDeclaredAnnotations()) {
							System.out.println("Annotation in Method '" + method + "' : " + anno);
						}
						MethodInfo methodAnno = method.getAnnotation(MethodInfo.class);
						if (methodAnno.revision() == 1) {
							System.out.println("Method with revision no 1 = " + method);
						}

					} catch (Throwable ex) {
						ex.printStackTrace();
					}
				}
			}
		} catch (SecurityException | ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

}

위 프로그램의 출력은 다음과 같습니다.

Annotation in Method 'public java.lang.String com.journaldev.annotations.AnnotationExample.toString()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=Main method, date=Nov 17 2012)
Method with revision no 1 = public java.lang.String com.journaldev.annotations.AnnotationExample.toString()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @java.lang.Deprecated()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=deprecated method, date=Nov 17 2012)
Method with revision no 1 = public static void com.journaldev.annotations.AnnotationExample.oldMethod()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.genericsTest() throws java.io.FileNotFoundException' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=10, comments=Main method, date=Nov 17 2012)

Reflection API는 매우 강력하며 Java, Spring과 같은 J2EE 프레임워크, Java의 Reflection에서 널리 사용됩니다. 여기까지가 자바 주석 예제 튜토리얼의 전부입니다. 여기에서 무언가를 배웠기를 바랍니다. Java 주석 업데이트:

  1. Servlet Specs 3.0에서는 Servlet 구성 및 초기화 매개변수에 대한 주석 사용을 도입했습니다. 자세한 내용은 Java Servlet Tutorial을 참조하세요.
  2. Struts 2의 주석을 사용하여 액션 클래스와 결과 페이지를 구성할 수 있습니다. Struts 2 Hello World Annotation Example에서 작업 예제를 확인하세요.

참조: 오라클 웹사이트