[프로그래머스] 자바 중급 - 어노테이션

정현우·2021년 4월 3일
2

Java Basic

목록 보기
6/8
post-thumbnail

자바 어노테이션(Annotation)

Java 5부터 추가 된 기능. 간단하게 메타코드(추가 정보) 제공
알맹이만 가볍고 빠르게 알아보자!

어노테이션 이란?

정리

  • Java 5 부터 추가 된 기능이다!
  • 어노테이션(Annotation)은 메타데이터(metadata)라고 볼 수 있다. 메타데이터는 Application이 처리하는 데이터가 아니고, 컴파일 과정과 런타임 과정에서 코드를 어떻게 컴파일하고 처리할것인지를 알려주는 정보
  • 클래스나 메소드 위에 붙여 사용한다 -> ex) @Override
  • 어노테이션은 자바가 기본으로 제공해주는 것도 있고, 사용자가 직접 만들 수도 있다.
  • 사용자가 직접 작성하는 어노테이션을 Custom 어노테이션이라고 말합니다.
    • 커스텀 어노테이션을 이용하는 방법은 단순하게 보면 아래와 같다!
      1. 어노테이션을 정의한다.
      2. 어노테이션을 클래스에서 사용한다. (타겟에 적용)
      3. 어노테이션을 이용하여 실행.

살펴보기

  • 기본으로 존재하는 어노테이션은 무엇이 있을까?

    • @Override : 선언한 메소드가 오버라이드(재정의) 되었다는 것을 나타낸다.
    • @Deprecated : 해당 메소드 혹은 객체가 더 이상 사용되지 않음을 표시한 것이다. 만약 해당 메소드 혹은 객체를 사용할 경우 컴파일 경고를 발생시킨다.
    • @SuppressWarnings : 선언한 곳의 컴파일 경고를 무시하도록 한다.
    • @SafeVerargs : Java7 부터 지원하며, 제네릭 같은 가변인자의 매개변수를 사용할 때의 경고를 무시한다.
    • @FunctionalInterface : Java8 부터 지원하며, 함수형 인터페이스를 지정하는 어노테이션이다. 만약 메소드가 존재하지 않거나, 1개 이상의 메소드(default 메소드 제외)가 존재할 경우 컴파일 오류를 발생시킨다
  • 너무 깊이 있게 다루진 않을 꺼다!

사용하기

  • 이클립스 IDE 기준으로 가자, class만들듯이 new annotation으로 우클릭으로 추가가 가능하다.
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;

    @Retention(RetentionPolicy.RUNTIME)
    public @interface Count100 {

    }
  • 패키지 익스플로러에서 [new - Annotation]을 이용하여 Count100이라는 어노테이션 생성!
  • Count100어노테이션을 JVM실행시에 감지할 수 있도록 하려면 @Retention(RetentionPolicy.RUNTIME)를 붙여줘야 합니다.
  • 이렇게 만든 어노테이션을 임의의 class에서 사용해보자!
    public class MyHello {
        @Count100
        public void hello(){
            System.out.println("hello");
        }
    }
  • MyHello클래스를 이용하는 MyHelloExam클래스를 작성!
  • MyHello의 hello메소드가 @Count100어노테이션이 설정되어 있을 경우, hello()메소드를 100번 호출하도록 해보자!
  • getDeclaredMethod를 제대로 이해하려면 앞서 Reflection에 대해 알아야 한다.
    • 참고자료!, 자료많다!
    • 아래 코드는 위 내용을 응용해서 어노테이션을 감지해 if 처리하는 로직이다!
    import java.lang.reflect.Method;

    public class MyHelloExam {
        public static void main(String[] args) {
            MyHello hello = new MyHello();

            try{
                Method method = hello.getClass().getDeclaredMethod("hello");
            if(method.isAnnotationPresent(Count100.class)){
                    for(int i = 0; i < 100; i++){
                        hello.hello();
                    }
                }else{
                    hello.hello();
                }
            }catch(Exception ex){
                ex.printStackTrace();
            }       
        }
    }
profile
도메인 중심의 개발, 깊이의 가치를 이해하고 “문제 해결” 에 몰두하는 개발자가 되고싶습니다. 그러기 위해 항상 새로운 것에 도전하고 노력하는 개발자가 되고 싶습니다!

0개의 댓글