@ 어노테이션 (Annotation)

준우·2022년 4월 27일
0

Java

목록 보기
15/30
post-thumbnail

❓ 어노테이션이 뭔데?

어노테이션이란 Java 5 부터 추가된 기능으로,
"@('골뱅이' 또는 '앳'이라고 부름)" 뒤에 소스 코드에 대한 추가 정보를
적는 식으로 사용되며 클래스나, 메소드 위에 붙여 메타 코드(추가 정보)를 주는 것이다.


public class MyAction extends Action {

    @Override //어노테이션!
    public void exec() {
        System.out.println("exec");
    }
}

한 예시로는 위 코드에서 @Override 가 어노테이션이다.

오버라이딩 메소드 윗 줄에 @ + Override 키워드를 붙여
해당 메소드가 오버라이딩 소스코드라는 정보를 주는 것이다.

👩‍💻 커스텀 어노테이션

어노테이션은 자바에서 제공하는 것외에도 사용자가 직접 정의하여 사용할 수도 있는데
이런 어노테이션을 커스텀 어노테이션이라고 한다.
커스텀 어노테이션을 사용하는 방법은 1) 정의하고 2) 사용하고 3) 실행하는 것이다.

어노테이션 정의하기

intelliJ를 기준으로 커스텀 어노테이션을 만드는 방법을 설명하자면
프로젝트 > 패키지 > 새로 만들기 > Java 클래스 > 어노테이션을 선택하고 이름을 정한 뒤, Enter 키를 누르면 된다.

그러면 interface 앞에 @ 가 붙은 모습으로 어노테이션이 생성된다.
이 다음에는 아래와 같이 import 해주고 @Retention 어노테이션을 작성한다.
해당 어노테이션을 실행할 때 JVM이 이를 감지할 수 있도록 하는 것이다.

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)

이렇게 어노테이션 생성은 끝났다. 이어서 어노테이션을 사용하는 클래스를 만들어보자.

어노테이션 사용하기

MyHello 라는 클래스를 만들고, "hello" 라는 문자열을 출력하는
hello() 메소드 위에 방금 만든 Count100 어노테이션을 사용했다.

public class MyHello {

    @Count100
    public void hello(){
        System.out.println("hello");
    }
}

어노테이션 실행하기

import java.lang.reflect.Method;

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

        Method method = hello.getClass().getDeclaredMethod("hello");
    }
}

java.lang.reflect.Method를 import 하면
메소드 타입의 메소드 객체를 사용할 수 있다.

그리고 모든 클래스의 최상위 클래스인 object 클래스가 가진
getClass() 메소드로 해당 인스턴스를 만들 때 사용한 정보를 리턴받는다.

그 정보를 받아서 getDeclaredMethod()를 호출하면
()안에 적힌 이름을 가진 메소드에 대한 정보를 구할 수 있다.

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

        try {
            Method method = hello.getClass().getDeclaredMethod("hello");
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
    }
}

필요한 경우 위와 같이 try catch 블록을 사용해 예외처리를 한다.

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

그리고 MyHello 클래스를 이용하는 MyHelloExam 클래스를 만들어서
MyHello의 hello메소드가 @Count100 어노테이션이 설정되어 있을 경우,
hello() 메소드를 100번 호출하도록 하는 등의 구현을 통해 정보를 얻어올 수 있다.

자바가 아주 능숙해지기 전까지는 어노테이션을 직접 만들기보다
다른 사람이 만든 것을 사용하는 일이 더 잦을 수 있다.
커스텀 어노테이션마다 기능이 다를 수 있으므로 다른 사람이 만든
커스텀 어노테이션을 사용할 때에는 설명서를 잘 참고하는 것이 좋다.

🙏 Reference

0개의 댓글