Java 기본 (8) - Annotation(애너테이션)

김정욱·2021년 6월 18일
0

Java

목록 보기
8/13
post-thumbnail

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에서 제공하는 애너테이션
  • 아래 짙게 표시된 것메타 애너테이션이라고 부름
    --> 애너테이션을 만들 때 사용하는 애너테이션

[ 종류 ] 표준 에너테이션

@Override

  • 오버라이딩올바르게 했는지 컴파일러가 체크
  • 자바 컴파일러javac검사
  • 메서드 이름을 잘못 적는 실수가 많은데, 이러한 문제를 예방할 수 있음
  • 작성하지 않는다고 오버라이드 안되는 것은 아님
class Child extends Paraent {
  @Override
  void parentMethod(){}
}

@Deprecated

  • 앞으로 사용하지 않을 것권장하는 필드메서드에 붙인다
  • Java에서 이전 버전과의 하위 호환성중요하게 생각한다
  • 그래서 수행 될 수는 있게 하되, 사용하지 않을 것권장하는 방법으로 사용된다
/* 실제 Date클래스의 getDate() */
@Deprecated
public int getDate(){
  return normalize().getDayOfMonth();
}

@FunctionalInterface

  • 함수형 인터페이스에는 하나의 추상메서드만 가져야 한다는 제약이 있으며, 이것을 검사하는 것
  • 함수형 인터페이스에 붙여서 컴파일러가 올바르게 작성했는지 체크
  • 작성하지 않는다고 함수형 인터페이스를 생성하지 못하는 것은 아님
@FunctionalInterface
public interface Runnable{
  public abstract void run();
}

@SuppressWarnings

  • 컴파일러경고메시지나타나지 않게 억제하는 애너테이션
  • 개발자경고를 확인했다는 의미사용되기도 한다
  • 확인한 경고억제를 해줘야 새로운 경고나타났을 때 확인하기가 좋다
/* unchecked 경고를 나타나지 않게 억제 */
// ArrayList는 제네식 클래스라서 타입을 지정해야 하는데 하지 않았기에 경고가 발생됨
@SuppressWarnings("unchecked")
ArrayList list = new ArrayList();
list.add(obj);
  • 여러개의 경고동시에 억제할수도 있음
@SuppressWarnings({"deprecation", "unchecked"})

@Target

  • 메타 에너테이션한 종류
  • 에너테이션을 정의할 때, 적용대상 지정에 사용
  • 지정 타겟 종류
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings{
  String[] value();
}

@Retention

  • 메타 에너테이션한 종류
  • 에너테이션이 유지(retention)되는 기간지정하는데 사용
  • 종류 - SOURCE / RUNTIME주로 사용
    • SOURCE
    • CLASS : 기본값이나 잘 사용되지 않음
    • RUNTIME
  • 예시
    • @Override컴파일러오버라이딩을 체크하는 것임
      --> 소스 파일에만 존재하면 된다
      --> SOURCE
    • @FunctionalInterface실행시에 사용 가능해야 함
      --> 클래스 파일에 존재해야 하며, 실행시에 사용 가능해야 함
      --> RUNTIME

@Documented / @Inherited

  • 메타 에너테이션종류
  • @Documented
    • javadoc으로 작성한 문서포함시키기 위해 사용
    • 직접 사용할 일은 거의 없음
  • @Inherited
    • 애너테이션자손 클래스에 상속하고자 할 때 사용
    • 역시 많이 사용되는 에너테이션은 아님

@Repeatable

  • 메타 에너테이션한 종류
  • 반복해서 붙일 수 있는 애너테이션정의할 때 사용
  • 반복해서 표현할 애너테이션묶을 컨테이너 애너테이션함께 정의해서 사용해야 함
  • 역시 자주 사용되지는 않으므로 존재 여부만 확인
@Repeatable(Todos.class)
@interface ToDo{
  String value();
}

@ToDo("delete test codes")
@ToDo("override inherited methods")
class MyClass{
  ...
}

@interface ToDos{
  ToDo[] value();
}
profile
Developer & PhotoGrapher

0개의 댓글