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를 처음 써보는거라 어려웠지만 쓰다보니까 적응이 돼었다.
'내일배움캠프 Spring 5기' 카테고리의 다른 글
내일배움캠프 24일차 TIL - Generic Static Method (0) | 2024.05.21 |
---|---|
내일배움캠프 23일차 TIL - JVM (0) | 2024.05.20 |
내일배움캠프 21일차 TIL - Spring(IoC, DI) (0) | 2024.05.16 |
내일배움캠프 20일차 TIL - Spring(API) (0) | 2024.05.13 |
내일배움캠프 19일차 TIL - Iterator (0) | 2024.05.12 |