∮explotación≒ 개발

java 주석

TipoAzul 2023. 3. 15.
반응형

java Annotations 자바 주석

주석

주석에는 다음과 같은 여러 가지 용도가 있습니다:

  • 컴파일러 정보 — 컴파일러는 주석을 사용하여 오류를 감지하거나 경고를 억제 할 수 있습니다.
  • 컴파일 타임 및 배포 타임 처리 — 소프트웨어 도구는 주석 정보를 처리하여 코드, XML 파일 등을 생성 할 수 있습니다.
  • 런타임 처리 — 런타임에 일부 주석을 검사 할 수 있습니다.

이 섹션에서는 주석을 사용할 수있는 위치, 주석을 적용하는 방법, Java Platform, Standard Edition ( Java SE API )에서 사용할 수있는 사전 정의 된 주석 유형에 대해 설명합니다, 플러그 형 시스템과 함께 유형 주석을 사용하여보다 강력한 유형 검사로 코드를 작성하는 방법 및 반복 주석을 구현하는 방법.

 

주석의 형식

가장 간단한 형태로 주석은 다음과 같습니다:

@Entity
 

at 기호 문자 (@)은 컴파일러에게 다음 내용이 주석임을 나타냅니다. 다음 예에서 주석의 이름은 Override:

@Override
void mySuperMethod() { ... }
 

주석은 다음을 포함 할 수있다 요소, 명명 또는 명명되지 않을 수 있으며 해당 요소에 대한 값이 있습니다:

@Author(
   name = "Benjamin Franklin",
   date = "3/27/2003"
)
class MyClass { ... }
 

또는

@SuppressWarnings(value = "unchecked")
void myMethod() { ... }
 

이름이 하나 뿐인 경우 value, 그러면 다음과 같이 이름을 생략 할 수 있습니다:

@SuppressWarnings("unchecked")
void myMethod() { ... }
 

주석에 요소가 없으면 이전과 같이 괄호를 생략 할 수 있습니다 @Override 예.

동일한 선언에 여러 주석을 사용할 수도 있습니다:

@Author(name = "Jane Doe")
@EBook
class MyClass { ... }
 

주석의 유형이 같으면이를 반복 주석이라고합니다:

@Author(name = "Jane Doe")
@Author(name = "John Smith")
class MyClass { ... }
 

Java SE 8 릴리스부터 반복 주석이 지원됩니다. 자세한 내용은 주석 반복 섹션을 참조하십시오.

주석 유형은 다음에 정의 된 유형 중 하나 일 수 있습니다 java.lang 또는 java.lang.annotation Java SE API 패키지. 이전 예제에서, Override 과 SuppressWarnings 사전 정의 된 Java 주석입니다. 자신의 주석 유형을 정의 할 수도 있습니다. 그만큼 Author 과 Ebook 이전 예제의 주석은 사용자 정의 주석 유형입니다.

 

주석을 사용할 수있는 곳

클래스, 필드, 메소드 및 기타 프로그램 요소의 선언과 같은 선언에 주석을 적용 할 수 있습니다. 선언에 사용될 때, 각 주석은 종종 자체 라인에 나타납니다.

Java SE 8 릴리스부터 주석을 유형 사용에 적용 할 수도 있습니다. 다음은 몇 가지 예입니다:

  • 클래스 인스턴스 생성 표현식:
  • new @Interned MyObject();
    
     
  • 타입 캐스트:
  • myString = (@NonNull String) str;
    
     
  • 구현 조항:
  • class UnmodifiableList<T> implements
      @Readonly List<@Readonly T> { ... }
    
     
  • 예외 선언:
  • void monitorTemperature() throws
      @Critical TemperatureException { ... }
    
     

이 주석의 형태를 유형 주석.

 

주석 유형 선언

많은 주석이 코드의 주석을 대체합니다.

소프트웨어 그룹이 전통적으로 중요한 정보를 제공하는 의견으로 모든 클래스의 본문을 시작한다고 가정하십시오:

public class Generation3List extends Generation2List {

   // Author: John Doe
   // Date: 3/17/2002
   // Current revision: 6
   // Last modified: 4/12/2004
   // By: Jane Doe
   // Reviewers: Alice, Bill, Cindy

   // class code goes here

}
 

주석과 동일한 메타 데이터를 추가하려면 먼저 주석 유형을 정의해야합니다. 이를위한 구문은 다음과 같습니다:

@interface ClassPreamble {
   String author();
   String date();
   int currentRevision() default 1;
   String lastModified() default "N/A";
   String lastModifiedBy() default "N/A";
   // Note use of array
   String[] reviewers();
}
 

주석 유형 정의는 키워드 인터페이스 앞에 at 기호 (가있는 인터페이스 정의와 유사합니다.@) (@ 주석 유형 =에서와 같이 ) AT. 주석 유형은 인터페이스의 한 형태이며 이후 섹션에서 다룰 것입니다. 현재 인터페이스를 이해할 필요가 없습니다.

이전 주석 정의의 본문에는 주석 유형 요소 선언이 포함되어 있으며 메소드와 매우 유사합니다. 선택적 기본값을 정의 할 수 있습니다.

주석 유형이 정의 된 후 다음과 같이 값이 채워진 해당 유형의 주석을 사용할 수 있습니다:

@ClassPreamble (
   author = "John Doe",
   date = "3/17/2002",
   currentRevision = 6,
   lastModified = "4/12/2004",
   lastModifiedBy = "Jane Doe",
   // Note array notation
   reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List {

// class code goes here

}
 

참고 : 정보를 만들려면 @ClassPreamble Javadoc 생성 문서에 나타나면 @ClassPreamble 정의 @Documented 주석:

// import this to use @Documented
import java.lang.annotation.*;

@Documented
@interface ClassPreamble {

   // Annotation element definitions
   
}
 

 

미리 정의 된 주석 유형

주석 유형 세트는 Java SE API에서 사전 정의되어 있습니다. 일부 주석 유형은 Java 컴파일러에서 사용되며 일부는 다른 주석에 적용됩니다.

Java 언어에서 사용하는 주석 유형

java.lang에 정의 된 사전 정의 된 주석 유형은 다음과 같습니다 @Deprecated@Override@SuppressWarnings.

@더 이상 사용되지 않습니다

@Deprecated 주석은 표시된 요소가 더 이상 사용되지 않으며 더 이상 사용되지 않아야 함을 나타냅니다. 컴파일러는 프로그램이 메소드, 클래스 또는 필드를 사용할 때마다 경고를 생성합니다 @Deprecated 주석. 요소가 더 이상 사용되지 않으면 Javadoc을 사용하여 문서화해야합니다 @deprecated 다음 예와 같이 태그. at 기호 ( 사용@Javadoc 의견과 주석 모두에서 )은 우연의 일치가 아닙니다. 개념적으로 관련되어 있습니다. 또한 Javadoc 태그는 소문자로 시작합니다 d 주석은 대문자로 시작합니다 D.

// Javadoc comment follows
/**
 * @deprecated
 * explanation of why it was deprecated
 */
@Deprecated
static void deprecatedMethod() { }
 

Java SE 9부터 forRemoval 속성이 추가되었습니다 @Deprecated 주석. 주석이 달린 요소가 이후 버전에서 제거 될 수 있는지 여부를 나타냅니다. 기본값은 false.

@Override

@Override주석은 요소가 수퍼 클래스에서 선언 된 요소를 대체하기위한 것임을 컴파일러에 알립니다. 재정의 방법은 인터페이스 및 상속 섹션에서 설명합니다.

// mark method as a superclass method
// that has been overridden
@Override 
int overriddenMethod() { }
 

메소드를 재정의 할 때이 주석을 사용할 필요는 없지만 오류를 방지하는 데 도움이됩니다. 방법이 @Override 수퍼 클래스 중 하나에서 메소드를 올바르게 무시하지 못하면 컴파일러가 오류를 생성합니다.

@SuppressWarnings

@SuppressWarnings주석은 컴파일러에게 그렇지 않으면 생성 될 특정 경고를 억제하도록 지시합니다. 다음 예에서는 더 이상 사용되지 않는 방법이 사용되며 컴파일러는 일반적으로 경고를 생성합니다. 그러나이 경우 주석으로 인해 경고가 억제됩니다.

// use a deprecated method and tell 
// compiler not to generate a warning
@SuppressWarnings("deprecation")
void useDeprecatedMethod() {
    // deprecation warning
    // - suppressed
    objectOne.deprecatedMethod();
}
 

모든 컴파일러 경고는 카테고리에 속합니다. Java 언어 사양에는 더 이상 사용되지 않는 것과 선택되지 않은 두 가지 범주가 나열됩니다. 확인되지 않은 경고는 제네릭이 출현하기 전에 작성된 레거시 코드와 인터페이스 할 때 발생할 수 있습니다. 여러 범주의 경고를 억제하려면 다음 구문을 사용하십시오:

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

@SafeVarargs

@SafeVarargs주석은 메소드 또는 생성자에 적용될 때 코드가 varargs 매개 변수에서 잠재적으로 안전하지 않은 작업을 수행하지 않는다고 주장합니다. 이 주석 유형을 사용하면 varargs 사용과 관련된 확인되지 않은 경고가 억제됩니다.

@FunctionalInterface

@FunctionalInterfaceJava SE 8에 도입 된 주석은 형식 선언이 Java 언어 사양에 정의 된 기능적 인터페이스임을 나타냅니다.

다른 주석에 적용되는 주석

다른 주석에 적용되는 주석을 메타 주석이라고합니다. 에 정의 된 몇 가지 메타 주석 유형이 있습니다 java.lang.annotation.

@보유

@Retention주석은 표시된 주석이 저장되는 방법을 지정합니다:

  • RetentionPolicy.SOURCE– 표시된 주석은 소스 레벨에서만 유지되며 컴파일러에서는 무시됩니다.
  • RetentionPolicy.CLASS– 표시된 주석은 컴파일시 컴파일러에 의해 유지되지만 Java Virtual Machine ( JVM )에서는 무시됩니다.
  • RetentionPolicy.RUNTIME– 표시된 주석은 JVM에 의해 유지되므로 런타임 환경에서 사용할 수 있습니다.

@Documented

@Documented주석은 지정된 주석은 Javadoc 도구를 사용하여 해당 요소를 문서화해야 함을 나타냅니다. ( 기본적으로 주석은 Javadoc에 포함되어 있지 않습니다. ) 자세한 내용은 Javadoc 도구 페이지를 참조하십시오.

@타겟

@Target주석은 주노가 적용될 수있는 Java 요소의 종류를 제한하기 위해 또 다른 주석을 표시합니다. 대상 주석은 다음 요소 유형 중 하나를 값으로 지정합니다:

@상속

@Inherited주석은 주석 유형이 수퍼 클래스에서 상속 될 수 있음을 나타냅니다. ( 기본적으로 사실이 아닙니다. ) 사용자가 주석 유형을 쿼리하고이 유형에 대한 클래스에 주석이없는 경우 클래스의 수퍼 클래스는 주석 유형에 대해 쿼리됩니다. 이 주석은 클래스 선언에만 적용됩니다.

@반복 가능

@RepeatableJava SE 8에 도입 된 주석은 표시된 주석은 동일한 선언 또는 유형 사용에 두 번 이상 적용될 수 있음을 나타냅니다. 자세한 내용은 주석 반복 섹션을 참조하십시오.

 

유형 주석 및 플러그 형 시스템

Java SE 8 릴리스 이전에는 주석 만 선언에 적용 할 수있었습니다. Java SE 8 릴리스부터 모든 유형 사용에 주석을 적용 할 수도 있습니다. 즉, 유형을 사용하는 모든 곳에서 주석을 사용할 수 있습니다. 유형이 사용되는 몇 가지 예는 클래스 인스턴스 생성 표현식 (입니다.new), 캐스트, 구현 절 및 던지기 절. 이 주석 형식을 유형 주석이라고하며 주석 기본 사항 섹션에 몇 가지 예가 제공됩니다.

보다 강력한 유형 검사를 보장하는 Java 프로그램의 개선 된 분석을 지원하기 위해 유형 주석이 작성되었습니다. Java SE 8 릴리스는 유형 검사 프레임 워크를 제공하지 않습니다, 그러나 Java 컴파일러와 함께 사용되는 하나 이상의 플러그 가능 모듈로 구현되는 유형 검사 프레임 워크 인 (을 작성하거나 )을 다운로드 할 수 있습니다.

예를 들어, 프로그램의 특정 변수가 null에 할당되지 않도록하려고합니다. 당신은 트리거를 피하고 싶어 NullPointerException. 이를 확인하기 위해 사용자 정의 플러그인을 작성할 수 있습니다. 그런 다음 코드를 수정하여 특정 변수에 주석을 달아 null에 할당되지 않았 음을 나타냅니다. 변수 선언은 다음과 같습니다:

@NonNull String str;
 

다음을 포함하여 코드를 컴파일 할 때 NonNull 명령 행의 모듈 인 컴파일러는 잠재적 인 문제를 감지하면 경고를 인쇄하여 오류를 피하기 위해 코드를 수정할 수 있습니다. 모든 경고를 제거하도록 코드를 수정 한 후에는 프로그램이 실행될 때이 특정 오류가 발생하지 않습니다.

각 모듈이 다른 종류의 오류를 확인하는 여러 유형 검사 모듈을 사용할 수 있습니다. 이러한 방식으로 Java 유형 시스템 위에 빌드하여 원하는시기와 위치에 특정 검사를 추가 할 수 있습니다.

유형 주석을 신중하게 사용하고 플러그 형 체커를 사용하면 더 강하고 오류가 적은 코드를 작성할 수 있습니다.

대부분의 경우 고유 한 유형 검사 모듈을 작성할 필요가 없습니다. 당신을 위해 일한 제 3자가 있습니다. 예를 들어, University of Washington에서 만든 Checker Framework를 활용할 수 있습니다. 이 프레임 워크에는 NonNull 모듈, 일반 표현식 모듈 및 뮤텍스 잠금 모듈. 자세한 내용은 체커 프레임 워크.

 

주석 반복

선언 또는 유형 사용에 동일한 주석을 적용하려는 상황이 있습니다. Java SE 8 릴리스부터 반복 주석을 사용하면이를 수행 할 수 있습니다.

예를 들어, UNIX 크론 서비스와 유사한 특정 시간 또는 특정 일정에 따라 메소드를 실행할 수있는 타이머 서비스를 사용하기위한 코드를 작성하고 있습니다. 이제 메소드를 실행하도록 타이머를 설정하려고합니다, doPeriodicCleanup(), 매월 마지막 날과 매주 금요일 오후 11시. 타이머를 실행하도록 설정하려면 @Schedule 주석을 달고 doPeriodicCleanup() 방법. 첫 번째 사용은 다음 코드 예제와 같이 매월 마지막 날을 지정하고 두 번째 사용은 금요일 오후 11시에 지정합니다:

@Schedule(dayOfMonth="last")
@Schedule(dayOfWeek="Fri", hour="23")
public void doPeriodicCleanup() { ... }
 

이전 예는 메소드에 주석을 적용합니다. 표준 주석을 사용하는 곳이면 어디든 주석을 반복 할 수 있습니다. 예를 들어 무단 액세스 예외를 처리하는 클래스가 있습니다. 당신은 하나를 가진 수업에 주석을 달았습니다 @Alert 관리자를위한 주석과 관리자를위한 주석:

@Alert(role="Manager")
@Alert(role="Administrator")
public class UnauthorizedAccessException extends SecurityException { ... }
 

호환성을 위해 반복 주석이 Java 컴파일러에 의해 자동으로 생성되는 컨테이너 주석에 저장됩니다. 컴파일러가이 작업을 수행하려면 코드에 두 가지 선언이 필요합니다.

1 단계 : 반복 가능한 주석 유형 선언

주석 유형은 @Repeatable 메타 주석. 다음 예는 사용자 정의를 정의합니다 @Schedule 반복 가능한 주석 유형:

@Repeatable(Schedules.class)
public @interface Schedule {
  String dayOfMonth() default "first";
  String dayOfWeek() default "Mon";
  int hour() default 12;
}
 

의 가치 @Repeatable 괄호 안의 메타 주석은 Java 컴파일러가 반복 주석을 저장하기 위해 생성하는 컨테이너 주석 유형입니다. 이 예에서 포함 주석 유형은 @Schedules, 반복 @Schedule 주석은 @Schedules 주석.

선언 할 수 있다고 선언하지 않고 선언에 동일한 주석을 적용하면 컴파일 타임 오류가 발생합니다.

2 단계 : 포함 주석 유형 선언

포함 주석 유형에는 value 배열 유형의 요소. 배열 유형의 구성 요소 유형은 반복 가능한 주석 유형이어야합니다. 에 대한 선언 @Schedules 주석 유형을 포함하는 것은 다음과 같습니다:

public @interface Schedules {
    Schedule[] value();
}
 

주석 검색

Reflection API에는 주석을 검색하는 데 사용할 수있는 몇 가지 방법이 있습니다. 단일 주석을 반환하는 메소드의 동작 (예 AnnotatedElement.getAnnotation(Class<T>), 요청 된 유형의 주석이 하나 뿐인 경우 단일 주석 만 반환한다는 점에서 변경되지 않습니다. 요청 된 유형의 주석이 둘 이상인 경우 먼저 컨테이너 주석을 받아 주석을 얻을 수 있습니다. 이런 식으로 레거시 코드가 계속 작동합니다. 컨테이너 주석을 통해 스캔하여 한 번에 여러 주석을 반환하는 다른 방법이 Java SE 8에 도입되었습니다 AnnotatedElement.getAnnotationsByType(Class<T>). 보다 AnnotatedElement 사용 가능한 모든 방법에 대한 정보는 클래스 사양입니다.

설계 고려 사항

주석 유형을 설계 할 때는 해당 유형의 주석의 카디널리티를 고려해야합니다. 주석의 유형이 다음과 같이 표시되면 주석을 0 번, 한 번 또는 사용할 수 있습니다 @Repeatable, 두 번 이상. 주석 유형을 사용하여 주석 유형을 사용할 수있는 위치를 제한 할 수도 있습니다 @Target 메타 주석. 예를 들어 메소드 및 필드에서만 사용할 수있는 반복 가능한 주석 유형을 만들 수 있습니다. 주석을 사용하는 프로그래머가 주석을 최대한 유연하고 강력하게 찾을 수 있도록 주석 유형을 신중하게 설계하는 것이 중요합니다.

 

 

 

 

2023.02.19 - [∮IT ≒ 아이티/∮Java ≒ 자바] - [java] Expressions

 

[java] Expressions

Expressions, Statements and Blocks 언어의 구문에 따라 구성되는 변수, 연산자 및 메소드 호출로 구성된 구성으로 단일 값으로 평가됩니다. int cadence = 0; anArray[0] = 100; System.out.println("Element 1 at index 0: " + a

tipoazul.tistory.com

 


 

 

※ 쿠팡 파트너스 활동을 통해 일정액의 수수료를 제공 받을 수 있습니다 

반응형

'∮explotación≒ 개발' 카테고리의 다른 글

javascript Array.prototype.indexOf()  (0) 2023.04.12
java 예외( Exception )  (0) 2023.03.26
java Lambda Expressions  (0) 2023.03.08
java Introducing Generics  (0) 2023.03.08
java Interfaces  (0) 2023.03.04

댓글