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(); }