⛺스파르타코딩클럽

내일배움캠프 22일차 TIL - Annotation

junbin2 2024. 5. 19. 22:13

240517

오늘의 학습 

    ●  1. Annotation

    ●  2. 리플렉션 개념

    ●  3. Stream & Lambda

 

 

Annotation

애너테이션이란?

자바에서 주석처럼 프로그래밍 언어에 영향을 미치지 않으며, 유용한 정보를 제공하는 것이 애너테이션이다.

 

메타 애너테이션
메타 애너테이션은 애너테이션을 위한 애너테이션이다.
@Target : 애너테이션이 적용 가능한 대상을 지정하는데 사용한다.
@Documented : 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다.
@Inherited : 애너테이션이 자손 클래스에 상속되도록 한다.
@Retention : 애너테이션이 유지되는 범위를 지정하는데 사용한다.
@Repeatable : 애너테이션을 반복해서 적용할 수 있게 한다.

1. @Target

애너테이션이 적용 가능한 대상을 지정하는데 사용한다.

즉, 애너테이션을 붙힐 수 있는 타겟을 지정하는 것이다. ( 애노테이션을 붙힐 수 있는 범위를 지정! )

ex) @Target({FIELD, TYPE}) 일 경우에는 클래스와 필드에만 애노테이션 @를 붙힐 수 있다는 의미이다.

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})
//TYPE : 타입(클래스, 인터페이스, enum), 파라미터, 메서드 생성자 등등
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

// TYPE : 클래스, interface, enum
// FIELD : 필드( 원시타입만 가능한듯 )
// TYPE_USE : 참조 멤버 변수
@Target({TYPE, FIELD, TYPE_USE})
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnotation {
}

@MyAnnotation // TYPE
public class MyClass {
	
    @MyAnnotation // FILED
    private int num;
    
    @MyAnnotation // TYPE_USE
    MyClass mc;
}

 

2. @Retention

애너테이션이 유지되는 범위를 지정하는데 사용한다. ( 언제까지 유지되는지 )

SOURCE

소스 파일에만 존재, 컴파일하고 나면 클래스 파일에는 존재하지 않는다.

컴파일이하고 런타임으로 가기전에 사라진다.

CLASS

클래스 로더까지 사용할 수 있으며, 클래스 파일에 존재, 실행시에 사용불가, 기본값이다.

RUNTIME

클래스 파일에 존재하고 실행시 까지 사용이 가능하다. 즉, 런타임까지 존재하는 것이다.

( 클래스 파일에 존재하기 때문에 가능한 것이다. 클래스 파일이 JVM으로 가서 실행되기 때문 )

 

3. @Documented

javadoc으로 작성한 문서에 포함시키려면 @Documented를 붙인다.

 

4. @Inherited

애너테이션을 자손 클래스에 상속하고자 할 때, @Inherited를 붙이게 된다.

이 애너테이션을 부모 클래스에 붙히게되면 자식클래스는 자바에서 상속을 받을 때 애너테이션도 함께 상속을 받는다.

@Inherited // 상속 
public @interface SuperAnno {
}

@SuperAnno
public class Parent {
}

// 여기에 @SuperAnno이 붙은걸로 인식 마치 자바의 상속과 비슷하다.
// @SuperAnno
public class Child extends Parent {

}

 

5. @Repeatable

반복해서 붙일 수 있는 애너테이션을 정의할 때 사용한다. 사용을 하기 위해선 컨테이너 애너테이션을 정의해야 한다.

// 반복해서 붙일 수 있는 애네터이션을 정의할 때 사용한다.
@Repeatable(ToDos.class)
@interface ToDo {
	String value();
}

// @Repeatable이 붙은 애너테이션은 반복해서 붙일 수 있다.
@ToDo("delete test codes.")
@ToDo("override inherited methods")
class MyClass {
	...
}
// @Repeatable인 @ToDo를 하나로 묶을 컨테이너 애너테이션도 정의해야한다.
@interface ToDos { // 여러 개의 ToDo애너테이션을 담을 컨테이너 애너테이션 ToDos
	ToDo[] value(); // ToDo애너테이션 배열타입의 요소를 선언, 이름이 반드시 value여야한다.
}

 

6. 애너테이션 타입 정의하기

애너테이션을 직접 만들어 쓸 수 있다.

 

애너테이션의 메서드는 추상 메서드로 선언을 하며, 애너테이션을 적용할 때 지정

애너테이션에서 또 다른 애너테이션 인터페이스를 요소로 정의할 수 있다.

 

애너테이션 인터페이스를 만들때 추상 메서드로 선언이 가능하며, 이 애너테이션을 사용하는 클래스에는 애너테이션을

붙히고 추상 메서드를 애너테이션 매개값으로 넣을 수 있다.

@Target(ElementType.TYPE)
public @interface AnnotationEx2 {
    int count();
    String str();
    String[] strArr();
    Test test();
}

@AnnotationEx2(count=1, 
               str="a", 
               strArr={"a","b","c"},
               test=@Test(str="testA", str2="testB"))
class AnnotationTest {

}

# 오늘의 회고

오늘은 애너테이션을 공부를했고 개인과제 또한 완성을 했다. 스프링과 JPA를 이용하여 개인과제를 진행을 했는데

JPA를 처음 써보는거라 어려웠지만 쓰다보니까 적응이 돼었다.