ref : 자바의 정석 남궁성님의 유튜브를 참조했습니다
https://www.youtube.com/watch?v=i4V8ZI9Undc
https://www.youtube.com/watch?v=7eX1EB76Dio
https://www.youtube.com/watch?v=p7KStWk8hWU
주석처럼프로그래밍 언어에영향을 미치지 않으며,유용한 정보를제공하는 것
Javadoc 주석의등장 배경
기존에는소스코드와그를 설명하기 위한 문서가따로 존재했으며변경시버전 불일치가 발생함- 그래서,
프로그래밍 소스코드에주석이란 것을 통해서유용한 정보를 제공하며,javadoc.exe가 주석을 읽어서필요한 문서를 만들어 낸다
- 애너테이션 등장 배경
소스코드와설정파일(XML 등)을따로 유지했었음 -->관리하기 불편- 그래서,
애너테이션이라는 것을 통해소스코드에설정정보를추가해서함께 유지하게 됨
설정정보를코드에 포함시켜유지할 수 있음
설정 파일을공유하는 불편함이없음소스코드의로직을 방해하지 않고,특정 프로그램을 위해정보를 제공할 수 있음
Java에서 제공하는애너테이션- 아래
짙게 표시된 것은메타 애너테이션이라고 부름
-->애너테이션을 만들 때 사용하는애너테이션
오버라이딩을올바르게 했는지컴파일러가 체크자바 컴파일러인javac가검사메서드 이름을 잘못 적는 실수가 많은데, 이러한 문제를예방할 수 있음- 작성하지 않는다고
오버라이드 안되는 것은 아님class Child extends Paraent { @Override void parentMethod(){} }
앞으로 사용하지 않을 것을권장하는필드나메서드에 붙인다Java에서 이전 버전과의하위 호환성을중요하게 생각한다- 그래서
수행 될 수는 있게하되,사용하지 않을 것을권장하는방법으로 사용된다/* 실제 Date클래스의 getDate() */ @Deprecated public int getDate(){ return normalize().getDayOfMonth(); }
함수형 인터페이스에는하나의 추상메서드만 가져야 한다는제약이 있으며,이것을 검사하는 것함수형 인터페이스에 붙여서컴파일러가 올바르게 작성했는지 체크- 작성하지 않는다고
함수형 인터페이스를 생성하지 못하는 것은 아님@FunctionalInterface public interface Runnable{ public abstract void run(); }
컴파일러의경고메시지가나타나지 않게 억제하는애너테이션개발자가경고를 확인했다는 의미로사용되기도 한다확인한 경고는억제를 해줘야새로운 경고가나타났을 때 확인하기가 좋다/* unchecked 경고를 나타나지 않게 억제 */ // ArrayList는 제네식 클래스라서 타입을 지정해야 하는데 하지 않았기에 경고가 발생됨 @SuppressWarnings("unchecked") ArrayList list = new ArrayList(); list.add(obj);
여러개의 경고를동시에 억제할수도 있음@SuppressWarnings({"deprecation", "unchecked"})
메타 에너테이션의한 종류- 에너테이션을 정의할 때,
적용대상 지정에 사용
- 지정 타겟 종류
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings{ String[] value(); }
메타 에너테이션의한 종류에너테이션이 유지(retention)되는 기간을지정하는데 사용- 종류 -
SOURCE/RUNTIME을주로 사용
- SOURCE
- CLASS :
기본값이나잘 사용되지 않음- RUNTIME
- 예시
@Override는컴파일러가오버라이딩을 체크하는 것임
-->소스 파일에만 존재하면 된다
-->SOURCE@FunctionalInterface는실행시에 사용 가능해야 함
-->클래스 파일에 존재해야 하며,실행시에 사용 가능해야 함
-->RUNTIME
메타 에너테이션의종류
@Documented
javadoc으로 작성한 문서에포함시키기 위해사용- 직접 사용할 일은 거의 없음
@Inherited
애너테이션을자손 클래스에 상속하고자 할 때 사용- 역시 많이 사용되는 에너테이션은 아님
메타 에너테이션의한 종류반복해서 붙일 수 있는 애너테이션을정의할 때 사용반복해서 표현할 애너테이션을묶을 컨테이너 애너테이션도함께 정의해서 사용해야 함- 역시 자주 사용되지는 않으므로 존재 여부만 확인
@Repeatable(Todos.class) @interface ToDo{ String value(); } @ToDo("delete test codes") @ToDo("override inherited methods") class MyClass{ ... } @interface ToDos{ ToDo[] value(); }