βοΈ μλ°μ μ νλ°λΆμ Annotationμ λν΄μ 곡λΆνλ€.
3μ£Όμ°¨ λ©ν λ§ μ€, λ©ν λκ»μ Lombokμ΄ μ°λ¦¬κ° μμ±ν μμ€μ½λμ μ΄λ»κ² κ°μ νλμ§ μ¬μ€λ³΄μ ¨λλ° μμ©μ΄ λμ§ μμμ λλ΅λ λͺ»νλ κΏλ¨Ήμ λ²μ΄λ¦¬κ° λμλ€.
μ΄λ² μκ°μλ Annotationμ λν΄μ κ°λ¨ν μ 리ν΄λ³΄μ!
Annotation
μΌλ§ μ 곡λΆν λ΄μ© μ€, @Override Annotation(μ΄ν μ΄λ Έν μ΄μ )μ λν΄μ 곡λΆνλ€. @Override μ΄λ Έν μ΄μ μ λΆλͺ¨ ν΄λμ€μμ μ μν μμ±μ νΉμ λ©μλλ₯Ό μμλ°λ μμν΄λμ€μμ μ¬μ μ ν λ, ν΄λΉ μμ±μ νΉμ λ©μλλ μ¬μ μλ μννλ κ²μ΄λΌκ³ λͺ μμ μΌλ‘ λνλ΄κΈ° μν΄ μ¬μ©λλ€.
ν΄λΉ μ΄λ Έν μ΄μ μ μμ€μ½λλ₯Ό νμΈν΄λ³΄λ©΄, @Override μ΄λ Έν μ΄μ μ 1. λ©μλ μμμμ μ¬μ© ν μ μμΌλ©° 2. μ»΄νμΌλ¬μ μν΄ μ»΄νμΌ μ μμ€μ½λμμ μ κ±°λλ€.
package java.lang;
import java.lang.annotation.*;
/**
* Indicates that a method declaration is intended to override a
* method declaration in a supertype. If a method is annotated with
* this annotation type compilers are required to generate an error
* message unless at least one of the following conditions hold:
*
* <ul><li>
* The method does override or implement a method declared in a
* supertype.
* </li><li>
* The method has a signature that is override-equivalent to that of
* any public method declared in {@linkplain Object}.
* </li></ul>
*
* @author Peter von der Ahé
* @author Joshua Bloch
* @jls 9.6.1.4 @Override
* @since 1.5
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
π λ©μλ μμμμ μ¬μ©κ°λ₯νλ€. → @Target(ElementType.METHOD)
π μ»΄νμΌλ¬μ μν΄ μ»΄νμΌ μ μμ€μ½λμμ μ κ±°λλ€. → @Retention(RetentionPolicy.SOURCE)
@Override μ΄λ Έν μ΄μ μ Javaμμ κΈ°λ³Έ μ 곡ν΄μ£Όλ 3 κ°μ§ μ΄λ Έν μ΄μ μ€ νλμΈλ°, μμ μ½λλ₯Ό ν΅ν΄ μ΄λ¬ν κΈ°λ³Έ μ΄λ Έν μ΄μ λ @Targe, @Retention κ°μ μ΄λ Έν μ΄μ μ€μ μ μν μ΄λ Έν μ΄μ μΌλ‘ μ€μ λμ΄ μλ κ²μ νμΈ ν μ μλ€. μ΄λ¬ν μ΄λ Έν μ΄μ μ Meta Annotationμ΄λΌκ³ νλ€.
Annotation λ½μλ¨ΉκΈ°
π μ΄λ Έν μ΄μ μ λ©ν λ°μ΄ν°λ‘μ¨, μ»΄νμΌ κ³Όμ κ³Ό μ€ν κ³Όμ μ€ ν΄λΉ μ΄λ Έν μ΄μ μ ν΅ν΄ μ΄λ»κ² μ²λ¦¬ ν κ²μΈμ§ λͺ μνλ μν μ μννλ€.
π Javaμμ κΈ°λ³ΈμΌλ‘ μ 곡νλ μ΄λ Έν μ΄μ μΌλ‘λ @Override, @Deprecated, @SuppressWarning μ΄ μ‘΄μ¬νλ©°, Java 7μμ @SafeVarargs, Java 8μμ @FunctionalInterface λ₯Ό μ§μνλ€.
Meta Annotation
Meata Annotation(μ΄ν λ©ν μ΄λ Έν μ΄μ )μ΄λ μ΄λ Έν μ΄μ μ λ§λ€κΈ° μν μ€μ μ λμμ£Όλ μ΄λ Έν μ΄μ μΌλ‘ java.lang.annotation ν¨ν€μ§ λ΄μ μμΉν΄μμΌλ©° μ½λλ₯Ό μ΄ν΄λ³΄λ©΄ μμ λν λ©ν μ΄λ Έν μ΄μ μΌλ‘ ꡬμ±λμ΄ μλ€.
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
/**
* Returns an array of the kinds of elements an annotation type
* can be applied to.
* @return an array of the kinds of elements an annotation type
* can be applied to
*/
ElementType[] value();
}
μ΄λ¬ν λ©ν μ΄λ Έν μ΄μ μ μλ‘κ² λ§λ€ μ΄λ Έν μ΄μ μ΄ μ΄λμ μ¬μ©λ μ§, μ΄λ€ μμ μμ μ μ©λ μ§, API λ¬Έμμ λ±λ‘μ ν μ§ λ±μ μ€μ ν μ μλ€. λ€μ 리μ€νΈλ₯Ό ν΅ν΄ νμΈν΄λ³΄μ.
π @Target
ElementType[]μ value κ°μΌλ‘ κ°μ§λ©°, ν΄λΉ λ°°μ΄μ ν΅ν΄ ν΄λΉ μ΄λ Έν μ΄μ μ΄ μ΄λμ μ μ© κ°λ₯νμ§ μ€μ ν μ μλ€. ν΄λΉ λ©ν μ΄λ Έν μ΄μ μ νλμ μ΄λ Έν μ΄μ μμ μ¬λ¬ κ°μ νκΉμ μ€μ ν μ μλ€.
βοΈ ElementType.TYPE : ν΄λμ€, μΈν°νμ΄μ€ νΉμ μ΄λ νμ μ μ μ© κ°λ₯νλ€.
βοΈ ElementType.FIELD : ν΄λμ€ λ΄ νλμ μ μ© κ°λ₯νλ€.
βοΈ ElementType.METHOD : λ©μλμ μ μ© κ°λ₯νλ€.
βοΈ ElementType.CONSTRUCTOR : μμ±μμ μ μ© κ°λ₯νλ€.
βοΈ ElementType.PARAMETER : λ§€κ° λ³μ μΈμμ μ μ© κ°λ₯νλ€.
βοΈ ElementType.LOCAL_VARIABLE : λ©μλ νΉμ μμ λ΄μ μ§μ λ³μμ μ μ© κ°λ₯νλ€.
βοΈ ElementType.ANNOTATION_TYPE : μ΄λ Έν μ΄μ νμ μ μ μ© κ°λ₯νλ€.
βοΈ ElementType.PACKAGE : ν¨ν€μ§μ μ μ© κ°λ₯νλ€.
βοΈ ElementType.TYPE_PARAMETER : Java 8 λΆν° μΆκ°λμ΄ νμ νλΌλ―Έν°μ μ μ© κ°λ₯νλ€.
βοΈ ElementType.TYPE_USE : Java 8 λΆν° μΆκ°λμ΄ ν΄λΉ νμ μ΄ μ¬μ©λλ€λ κ²μ λͺ μνλ€.
π @Retetion
RetentionPolicy[]μ value κ°μΌλ‘ κ°μ§λ©°, @Target μ΄λ Έν μ΄μ κ³Ό λμΌνκ² μ¬λ¬ κ°μ μ€μ κ°μ μ§μ ν μ μλ€. ν΄λΉ μ΄λ Έν μ΄μ μ μ΄λ€ μμ μ μ΄λ Έν μ΄μ μ μ μ©ν μ§ μ€μ νλ€.
βοΈ RetetionPolicy.SOURCE : μ»΄νμΌλ¬μ μν΄ μ μ©μμ μ μΈλλ€.
βοΈ RetetionPolicy.CLASS : μ»΄νμΌλ¬μ μν΄ .class νμΌλ‘ μ»΄νμΌ λ λ μ μ©λμ§λ§ Runtime μμ κΉμ§λ μ ν¨νμ§ λͺ»νλ€.
βοΈ RetetionPolicy.RUNTIME : 리νλ μ μ μν΄ μ»΄νμΌ μ΄νμλ μ§μμ μΌλ‘ μ°Έμ‘°κ° κ°λ₯νλ€.
π @Documented
ν΄λΉ λ©ν μ΄λ Έν μ΄μ μ μ μ©λ μ΄λ Έν μ΄μ μ΄ μλ° API λ¬Έμμ λ±λ‘λ μ§λ₯Ό μ€μ ν μ μλ€.
π @Inherited
ν΄λΉ λ©ν μ΄λ Έν μ΄μ μ μ μ©λ μ΄λ Έν μ΄μ μ μμμ κΈ°λ₯ λΆμ¬μ λν μ€μ μ λ΄λΉνλ€.
π @Repeateble
Java 8 λΆν° μΆκ°λμ΄ μ°μμ μΌλ‘ μ΄λ Έν μ΄μ μ μ μ© ν μ μλλ‘ μ§μνλ€.
Custom Annotation
package annotation;
import java.lang.annotation.*;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
@Inherited
public @interface Auth {
String name();
String date();
String description();
}
/*
@Auth(name = "μ¬μ±ν", date = "2021-05-24", description = "컀μ€ν
μ΄λ
Έν
μ΄μ
μ λ§λ€μ΄λ³΄μ!")
public class AnnotationTest {}
*/
π€ μ΄λ² μκ°μλ Lombok λμ»΄νμΌμ μμ보기 μν΄ Annotationμ΄ μ΄λ»κ² ꡬμ±λκ³ λ§λ€μ΄μ§λμ§ μμ보μλ€. λ€μ μκ°μλ μ°λ¦¬κ° μ£Όλ‘ μ¬μ©νλ μ΄λ Έν μ΄μ λ€μ΄ μ΄λ»κ² λμνλμ§ μμ보μ!
'Programming > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
F014 - List (ArrayList, LinkedList, Vector, Stack) (0) | 2021.05.30 |
---|---|
F013 - Generic (0) | 2021.05.26 |
F011 - java.lang.ref (0) | 2021.05.19 |
F010 - System.out.println(), Logger (0) | 2021.05.19 |
F009 - Inheritance, Composition (0) | 2021.05.18 |