-
애너테이션Computer Science/JAVA 2021. 8. 20. 22:38
1️⃣ 애너테이션이란
애너테이션은 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것이다.
애너테이션은 주석처럼 프로그래밍 언어에 영향을 미치지 않으면서도 다른 프로그램에게 유용한 정보를 제공할 수 있다는 장점이 있다.
2️⃣ 표준 애너테이션
@Override
메서드 앞에만 붙일 수 있는 애너테이션으로, 조상의 메서드를 오버라이딩하는 것이라는걸 컴파일러에게 알려주는 역할을 한다.
오버라이딩할 때 메서드의 이름을 잘못 적는 경우가 많은데, @Override를 붙이면 컴파일러가 같은 이름의 메서드가 조상에 있는지 확인하고 없으면, 에러 메시지를 출력한다.
Class Parent { void parentMethod() {} } Class Child extends Parent { @Override void parentMethod() {} }
@Deprecated
더 이상 사용되지 않는 필드나 메서드에 @Deprecated를 붙이면 이 애너테이션이 붙은 대상은 다른 것으로 대체되었으니 더 이상 사용하지 않을 것을 권한다는 의미이다.
@FunctionalInterface
함수형 인터페이스를 선언할 때, 이 애너테이션을 붙이면 컴파일러가 함수형 인터페이스를 올바르게 선언했는지 확인하고, 잘못된 경우 에러를 발생시킨다. 필수는 아니지만 실수를 방지할 수 있으므로 함수형 인터페이스를 선언할 때 반드시 붙이자.
@SuppressWarnings
컴파일러가 보여주는 경고메시지가 나타나지 않게 억제해준다.
class NewClass { int newField; int getNewField() { return newField; } @Deprecated int oldField; @Deprecated int getOldField() { return oldField; } } public class Annotation1 { @SuppressWarnings("deprecation") // deprecated 경고가 나타나지 않게 함 public static void main(String[] args) { NewClass nc = new NewClass(); nc.oldField = 10; System.out.println(nc.getOldField()); @SuppressWarnings("unchecked") ArrayList<NewClass> list = new ArrayList(); list.add(nc); } }
3️⃣ 메타 애너테이션
메타 애너테이션은, 애터네이션을 위한 애너테이션이다. 즉 애너테이션을 정의할 때 애너테이션의 적용대상이나 유지기간 등을 지정하는데 사용된다.
@Target
애너테이션이 적용 가능한 대상을 지정하는데 사용된다.
ANNOTATION_TYPE
CONSTRUCTOR
FIELD
LOCAL_VARIABLE
METHOD
PACKAGE
PARAMETER
TYPE
TYPE_PARAMETER
TYPE_USE
@Retention
애너테이션이 유지되는 기간을 지정하는데 사용된다.
SOURCE : 소스 파일에만 존재, 클래스 파일에는 존재하지 않음
CLASS : 클래스 파일에 존재, 실행시에 사용불가
RUNTIME : 클래스 파일에 존재, 실행시에 사용가능
유지 정책을 RUNTIME으로 하면 실행 시에 리플렉션을 통해 클래스 파일에 저장된 애너테이션의 정보를 읽어서 처리할 수 있다. @FunctionalInterface는 컴파일러가 체크해주는 애너테이션이지만, 실행 시에도 사용되므로 유지 정책이 RUNTIME이다.
@Documented
애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 한다.
@Inherited
애너테이션이 자손 클래스에 상속되도록 한다. @Inherited가 붙은 애너테이션을 조상 클래스에 붙이면, 자손 클래스도 이 애너테이션이 붙은 것과 같이 인식된다.
4️⃣ 애너테이션 타입 정의하기
@interface 애너테이션 이름 { 타입 요소 이름(); // 애너테이션의 요소를 선언한다. }
애너테이션의 요소
애너테이션 내에 선언된 매세드를 애너테이션의 요소라고 한다.
애너테이션의 요소는 반환값이 있고 매개변수는 없는 추상 매서드의 형태를 가지며, 상속을 통해 구현하지 않아도 된다. 다만, 애너테이션을 적용할 때 이 요소들의 값을 빠짐없이 지정해주어야 한다.
마커 애너테이션
값을 지정할 필요가 없는 경우, 애너테이션의 요소를 하나도 정의하지 않을 수 있다. Serializable이나 Cloneable처럼 요소가 하나도 정의되지 않은 애너테이션을 마커 애너테이션이라고 한다.
애너테이션 요소의 규칙
요소의 타입은 기본형, String, enum, 애너테이션, Class만 허용된다
()안에 매개변수를 선언할 수 없다
예외를 선언할 수 없다
요소를 타입 매개변수로 정의할 수 없다
@Deprecated @SuppressWarnings("1111") @TestInfo(testedBy = "aaa", testDate = @DateTime(yymmdd = "160101", hhmmss = "235959")) public class Annotation2 { public static void main(String[] args) { Class<Annotation2> cls = Annotation2.class; TestInfo anno = (TestInfo)cls.getAnnotation(TestInfo.class); System.out.println(anno.testedBy()); System.out.println(anno.testDate().yymmdd()); System.out.println(anno.testDate().hhmmss()); Annotation[] annoArr = cls.getAnnotations(); for (Annotation annotation : annoArr) { System.out.println(annotation); } } } @Retention(RetentionPolicy.RUNTIME) @interface TestInfo { int count() default 1; String testedBy(); String[] testTools() default "JUnit"; TestType testType() default TestType.FIRST; DateTime testDate(); } @Retention(RetentionPolicy.RUNTIME) @interface DateTime { String yymmdd(); String hhmmss(); } enum TestType { FIRST, FINAL }
'Computer Science > JAVA' 카테고리의 다른 글
쓰레드(2) (0) 2021.08.20 쓰레드(1) (0) 2021.08.20 열거형(enums) (0) 2021.08.20 Generics (0) 2021.08.20 String, StringBuilder, StringBuffer (0) 2021.08.20