java
이 튜토리얼에서는 예제를 통해 다양한 유형의 Java 주석에 대해 알아봅니다.
Java 주석은 프로그램 소스 코드에 대한 메타데이터(데이터에 대한 데이터)입니다. Java SE에서 제공하는 몇 가지 미리 정의된 주석이 있습니다. 또한 필요에 따라 사용자 지정 주석을 만들 수도 있습니다.
주석이 무엇인지 모르는 경우 Java 주석 튜토리얼을 방문하십시오.
이러한 주석은 다음과 같이 분류할 수 있습니다.
1. 사전 정의된 주석
@Deprecated
@Override
@SuppressWarnings
@SafeVarargs
@FunctionalInterface
2. 맞춤 특수효과
3. 메타 주석
@Retention
@Documented
@Target
@Inherited
@Repeatable
@Deprecated
주석은 요소(클래스, 메소드, 필드 등)가 더 이상 사용되지 않으며 새로운 요소로 대체되었음을 나타내는 마커 주석입니다.
구문은 다음과 같습니다.
@Deprecated
accessModifier returnType deprecatedMethodName() { ... }
프로그램이 더 이상 사용되지 않는다고 선언된 요소를 사용하면 컴파일러에서 경고를 생성합니다.
Javadoc @deprecated
을 사용합니다. 사용되지 않는 요소를 문서화하기 위한 태그입니다.
/**
* @deprecated
* why it was deprecated
*/
@Deprecated
accessModifier returnType deprecatedMethodName() { ... }
class Main {
/**
* @deprecated
* This method is deprecated and has been replaced by newMethod()
*/
@Deprecated
public static void deprecatedMethod() {
System.out.println("Deprecated method");
}
public static void main(String args[]) {
deprecatedMethod();
}
}
출력
Deprecated method<시간>
@Override
어노테이션은 서브클래스의 메소드가 동일한 메소드 이름, 리턴 유형 및 매개변수 목록을 갖는 수퍼클래스의 메소드를 재정의하도록 지정합니다.
@Override
를 반드시 사용해야 하는 것은 아닙니다. 메서드를 재정의할 때. 그러나 그것을 사용하면 메서드를 재정의하는 동안 잘못된 매개 변수 유형과 같은 문제가 있는 경우 컴파일러에서 오류가 발생합니다.
class Animal {
// overridden method
public void display(){
System.out.println("I am an animal");
}
}
class Dog extends Animal {
// overriding method
@Override
public void display(){
System.out.println("I am a dog");
}
public void printMessage(){
display();
}
}
class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.printMessage();
}
}
출력
I am a dog
이 예에서는 개체를 dog1 개의 클래스에서 printMessage() 메서드를 호출할 수 있습니다. 그런 다음 display()
를 실행합니다. 성명서.
display()
이후 두 클래스 모두에서 정의되며 하위 클래스 Dog의 메서드입니다. 슈퍼클래스 Animal의 메서드를 재정의합니다. . 따라서 display()
하위 클래스가 호출됩니다.
이름에서 알 수 있듯이 @SuppressWarnings
주석은 프로그램이 실행되는 동안 생성되는 경고를 억제하도록 컴파일러에 지시합니다.
억제할 경고 유형을 지정할 수 있습니다. 억제할 수 있는 경고는 컴파일러에 따라 다르지만 두 가지 범주의 경고가 있습니다. 지원 중단 및 선택 해제 .
특정 범주의 경고를 표시하지 않으려면 다음을 사용합니다.
@SuppressWarnings("warningCategory")
예를 들어,
@SuppressWarnings("deprecated")
여러 범주의 경고를 표시하지 않으려면 다음을 사용합니다.
@SuppressWarnings({"warningCategory1", "warningCategory2"})
예를 들어,
@SuppressWarnings({"deprecated", "unchecked"})
카테고리 deprecated
사용되지 않는 요소를 사용할 때 경고를 표시하지 않도록 컴파일러에 지시합니다.
카테고리 unchecked
원시 유형을 사용할 때 경고를 표시하지 않도록 컴파일러에 지시합니다.
그리고 정의되지 않은 경고는 무시됩니다. 예를 들어,
@SuppressWarnings("someundefinedwarning")
class Main {
@Deprecated
public static void deprecatedMethod() {
System.out.println("Deprecated method");
}
@SuppressWarnings("deprecated")
public static void main(String args[]) {
Main depObj = new Main();
depObj. deprecatedMethod();
}
}
출력
Deprecated method
여기 deprecatedMethod()
더 이상 사용되지 않는 것으로 표시되었으며 사용 시 컴파일러 경고가 표시됩니다. @SuppressWarnings("deprecated")
을 사용하여 주석을 사용하면 컴파일러 경고를 피할 수 있습니다.
@SafeVarargs
주석은 주석이 달린 메서드 또는 생성자가 varargs(가변 수의 인수)에 대해 안전하지 않은 작업을 수행하지 않는다고 주장합니다.
재정의할 수 없는 메서드나 생성자에만 이 주석을 사용할 수 있습니다. 이를 재정의하는 메서드가 안전하지 않은 작업을 수행할 수 있기 때문입니다.
Java 9 이전에는 재정의할 수 없기 때문에 최종 또는 정적 메서드에만 이 주석을 사용할 수 있었습니다. 이제 비공개 메서드에도 이 주석을 사용할 수 있습니다.
import java.util.*;
class Main {
private void displayList(List<String>... lists) {
for (List<String> list : lists) {
System.out.println(list);
}
}
public static void main(String args[]) {
Main obj = new Main();
List<String> universityList = Arrays.asList("Tribhuvan University", "Kathmandu University");
obj.displayList(universityList);
List<String> programmingLanguages = Arrays.asList("Java", "C");
obj.displayList(universityList, programmingLanguages);
}
}
경고
Type safety: Potential heap pollution via varargs parameter lists Type safety: A generic array of List<String> is created for a varargs parameter
출력
Note: Main.java uses unchecked or unsafe operations. [Tribhuvan University, Kathmandu University] [Tribhuvan University, Kathmandu University] [Java, C]
여기, List
... lists
List
유형의 가변 길이 인수를 지정합니다. . 이것은 displayList()
메소드가 0개 이상의 인수를 가질 수 있습니다.
위의 프로그램은 오류 없이 컴파일되지만 @SafeVarargs
일 때 경고를 표시합니다. 주석이 사용되지 않습니다.
@SafeVarargs
을 사용할 때 위의 예에서 주석,
@SafeVarargs private void displayList(List<String>... lists) { ... }
경고 없이 동일한 출력을 얻습니다. 이 주석을 사용할 때 확인되지 않은 경고도 표시되지 않습니다.
<시간>
Java 8은 이 @FunctionalInterface
를 처음 도입했습니다. 주석. 이 주석은 사용되는 형식 선언이 기능적 인터페이스임을 나타냅니다. 기능적 인터페이스는 하나의 추상 메소드만 가질 수 있습니다.
@FunctionalInterface
public interface MyFuncInterface{
public void firstMethod(); // this is an abstract method
}
다른 추상 메소드를 추가하면
@FunctionalInterface
public interface MyFuncInterface{
public void firstMethod(); // this is an abstract method
public void secondMethod(); // this throws compile error
}
이제 프로그램을 실행하면 다음 경고가 표시됩니다.
Unexpected @FunctionalInterface annotation @FunctionalInterface ^ MyFuncInterface is not a functional interface multiple non-overriding abstract methods found in interface MyFuncInterface
@FunctionalInterface
을 반드시 사용해야 하는 것은 아닙니다. 주석. 컴파일러는 기능 인터페이스 정의를 충족하는 모든 인터페이스를 기능 인터페이스로 간주합니다.
이 주석을 사용하여 기능 인터페이스에 추상 메서드가 하나만 있는지 확인합니다.
그러나 구현이 있기 때문에 기본 및 정적 메서드를 얼마든지 가질 수 있습니다.
@FunctionalInterface
public interface MyFuncInterface{
public void firstMethod(); // this is an abstract method
default void secondMethod() { ... }
default void thirdMethod() { ... }
}
<시간> 사용자 지정 주석을 만드는 것도 가능합니다.
구문은 다음과 같습니다.
[Access Specifier] @interface<AnnotationName> { DataType <Method Name>() [default value]; }
다음은 맞춤 주석에 대해 알아야 할 사항입니다.
@interface
을 사용하여 만들 수 있습니다. 주석 이름이 뒤따릅니다.
@interface MyCustomAnnotation {
String value() default "default value";
}
class Main {
@MyCustomAnnotation(value = "programiz")
public void method1() {
System.out.println("Test method 1");
}
public static void main(String[] args) throws Exception {
Main obj = new Main();
obj.method1();
}
}
출력
Test method 1<시간>
메타 주석은 다른 주석에 적용되는 주석입니다.
@Retention
주석은 주석을 사용할 수 있는 수준을 지정합니다.
구문은 다음과 같습니다.
@Retention(RetentionPolicy)
보존 정책에는 3가지 유형이 있습니다.
예를 들어,
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation{ ... }
<시간>
기본적으로 사용자 정의 주석은 공식 Java 문서에 포함되어 있지 않습니다. Javadoc 문서에 주석을 포함하려면 @Documented
을 사용합니다. 주석.
예를 들어,
@Documented
public @interface MyCustomAnnotation{ ... }
<시간>
@Target
을 사용하여 특정 대상에 적용할 주석을 제한할 수 있습니다. 주석.
구문은 다음과 같습니다.
@Target(ElementType)
ElementType
다음 유형 중 하나를 가질 수 있습니다.
요소 유형 | 대상 |
---|---|
ElementType.ANNOTATION_TYPE | 주석 유형 |
ElementType.CONSTRUCTOR | 생성자 |
ElementType.FIELD | 필드 |
ElementType.LOCAL_VARIABLE | 로컬 변수 |
ElementType.METHOD | 방법 |
ElementType.PACKAGE | 패키지 |
ElementType.PARAMETER | 매개변수 |
ElementType.TYPE | 클래스의 모든 요소 |
예를 들어,
@Target(ElementType.METHOD)
public @interface MyCustomAnnotation{ ... }
이 예에서는 이 주석의 사용을 메서드로만 제한했습니다.
참고: 대상 유형이 정의되지 않은 경우 주석은 모든 요소에 사용할 수 있습니다.
<시간>
기본적으로 주석 유형은 수퍼클래스에서 상속될 수 없습니다. 그러나 슈퍼클래스에서 서브클래스로 주석을 상속해야 하는 경우 @Inherited
를 사용합니다. 주석.
구문은 다음과 같습니다.
@Inherited
예를 들어,
@Inherited
public @interface MyCustomAnnotation { ... }
@MyCustomAnnotation
public class ParentClass{ ... }
public class ChildClass extends ParentClass { ... }
<시간>
@Repeatable
로 표시된 주석 동일한 선언에 여러 번 적용될 수 있습니다.
@Repeatable(Universities.class)
public @interface University {
String name();
}
@Repeatable
에 정의된 값 주석은 컨테이너 주석입니다. 컨테이너 주석에 값 변수가 있습니다. 위의 반복 가능한 주석의 배열 유형입니다. 여기 Universities
포함하는 주석 유형입니다.
public @interface Universities {
University[] value();
}
이제 @University
주석은 동일한 선언에서 여러 번 사용할 수 있습니다.
@University(name = "TU")
@University(name = "KU")
private String uniName;
<시간> 주석 데이터를 검색해야 하는 경우 Reflection API를 사용할 수 있습니다.
주석 값을 검색하려면 getAnnotationsByType()
를 사용합니다. 또는 getAnnotations()
Reflection API에 정의된 메서드입니다.
java
Java 메소드는 작업을 수행하기 위해 함께 그룹화되는 명령문의 모음입니다. System.out.println()을 호출할 때 예를 들어, 시스템은 콘솔에 메시지를 표시하기 위해 실제로 여러 명령문을 실행합니다. 이제 반환 값이 있거나 없는 고유한 메서드를 만들고 매개 변수가 있거나 없는 메서드를 호출하고 프로그램 디자인에서 메서드 추상화를 적용하는 방법을 배웁니다. 생성 방법 메소드의 구문을 설명하기 위해 다음 예를 고려하십시오 - 구문 public static int methodName(int a, int b) {
@Deprecated 주석은 Java 5 버전에서 도입되었습니다. @Deprecated 주석이 달린 프로그램 요소는 다음과 같은 이유로 사용되어서는 안 됨을 의미합니다. - 사용 시 오류가 발생할 수 있습니다. 향후 버전에서는 호환되지 않을 수 있습니다. 향후 버전에서 제거될 수 있습니다. 더 우수하고 효율적인 대안이 이를 대체했습니다. 컴파일러는 더 이상 사용되지 않는 요소가 사용될 때마다 경고를 생성합니다. Java 9에서는 @Deprecated 주석에 두 가지 새로운 기능이 향상되었습니다. 제거용 − 주석이 달린 요