글을 쓰기 전 제가 생각하는 annotation은 코드를 조금 더 쉽게 쓸 수 있게 사용되는 것이며 프로젝트 당시 데이터를 호출하거나 api통신을 할때 편의를 위해서 사용된 내용?으로 생각했습니다. 하지만 자세하게 내용을 알아야 면접 또는 프로젝트를 진행할 때 내가 배웠던 내용을 토대로 설명을 할 수 있기때문에 리펙토링 기간동안 복습하게 되었습니다.
Annotation은 클래스와 메서드에 추가하며 다양한 기능을 부여하는 역할을 합니다.
Annotation을 활용하여 Spring Framework는 해당 클래스가 어떤 역할인지 정하기도 하고, Bean을 주입하기도 하며, 자동으로 getter나 setter를 생성하기도 합니다. 특별한 의미를 부여하거나 기능을 부여하는 등 다양한 역할을 수행할 수 있습니다.
이러한 Annotation을 통하여 코드량이 감소하고 유지보수하기 쉬우며, 생산성이 증가됩니다.
이렇게 설명만 보면 어려움이 있어서 이 블로그를 보면서 이해함.
위 블로그 내용처럼 나도 그림을 그리면서 이해함.
과거의 파일 관리에대한 두 가지 어려움
사람들이 자바 코드는 변경하는데 설정 파일을 업데이트 하지 않는 어려움
설정과 코드가 분리되어있어, 개발에 대한 어려움
이 두 가지 어려움을 해결하고자 다음 관리방법을 설정
표준(내장) 어노테이션
class Parent{
void parentMethod(){}
}
class Child extends Parent{
@Override
void parentmethod(){}
..
}
@Deprecated
public int getDate(){
return normalize().getDayOfMonth();
}
// Array를 선언할 때 제네릭을 통해서 타입에 대한 정보를 기입하지않음.
// 타입을 선언하지 않았다는 "unchecked"라는 경고가 뜸.
// 하지만 @SuppressWarnings("unchecked")를 입력해주었기때문에 "unchecked"에 대한 경고는 억제됨.
@SuppressWarnings("unchecked")
ArrayList list = new ArrayList();
list.add(obj);
02.21 study내용
글쓴이 생각 : 표준 어노테이션에서 프로젝트를 진행하면서 봐왔던 내용은 @Override가 대표적인 것 같다.
@Override
어노테이션을 정의할 때, 적용대상을 지정하는데 사용함.
Java compiler가 annotation이 어디에 적용될 지 결정하기 위해 사용
종류
@Target({TYPE, FIELD, TYPE_USE})
@Retention(RetentionPolicy.SOURCE())
@public @interface MyAnnotation{}
@MyAnnotation
class MyClass{
@MyAnnotation
int i;
@MyAnnotation
MyClass mc:
}
// SOURCE : 소스 파일에만 존재
// RUNTIME : 클래스 파일에 존재. 실행시에 사용가능
// CLASS : 클래스 파일에 존재. 실행 시에 사용 불가. 기본 값
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{}
어노테이션도 상속이 가능하다.
어노테이션을 자손 클래스에 상속하고자 할 때, @Inherited를 붙임
@Inherited
@interface SuperAnno{}
@SuperAnno
class Parent{}
class Child extends Parent{}
반복해서 붙일 수 있는 어노테이션을 정의할 때 사용
@Repeatable이 붙은 애너테이션은 반복해서 붙일 수 있음.
@Repeatable(ToDos.class)
@interface ToDo{
String value();
}
@ToDo("delete test codes.")
@ToDo("override inherited methods")
class MyClass{
~~
}
@interface ToDos{
ToDo[] value();
}
어노테이션 사용하기
@Retry(maxRetryCount = 10, maxAbc = 111)
public String save(String itemId) {
seq ++;
if (seq % 2 == 0){
throw new IllegalStateException("예외 발생");
}
return "ok";
}
@interface 이름{
타입 요소 이름(); // 어노테이션의 요소를 선언
..
}
@interface DateTime{
String yymmdd();
String hhmmss();
}
@interface TestInfo{
int count() default 1;
String testedBy();
TestType testType();
DateTime testDate();
}
@TestInfo{
testedBy = "Kim",
testTools = {"JUnit", "AutoTester"},
testType = TestType.FIRST,
testDate = @DateTIme(yymmdd="210922", hhmmss="211311")
} // count를 생략했으므로 default인 "count=1"이 적용
public class NewClass{...}
@interface TestInfo{
String value();
}
@TestInfo("passed") //value="passed"와 동일
class NewClass{...}
@interface TestInfo{
String[] testTools();
}
@TestInfo(testTools={"JUnit", "AutoTester"})
@TestInfo(testTools="JUnit")
@TestInfo(testTool={})
// 잘못된 예시
@interface AnnoConfigTest{
int id = 100; // 상수 ok
String major(int i, int j) // 매개변수 x
String minor() throws Exception; // 예외 x
ArrayList<T> list(); // 요소의 타입을 매개변수 x
}