ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 어노테이션, 애너테이션(Annotation) - 애너테이션 정의하기
    백엔드/자바 2021. 5. 26. 16:09

    어노테이션을 만드는 것은 크게 어렵지 않다.

     

    기본적으로 인터페이스를 정의하는 것과 비슷하다고 생각하면 된다.

     

    그리고 애너테이션의 요소는 추상메서드를 정의하듯이 하면 된다.

    애너테이션 선언하기

     

    위와 같이 @interface + 애너테이션명 + 중괄호 { }를 붙여서 정의하면 된다.

     

    우선 위와 같이 정의만 해줘도 애너테이션의 형식은 갖춘 것이다.

     

     

     

    실제로 아무 내용이 없는 애너테이션이라도 저렇게 형식만 갖추면 사용이 가능하다.

    애너테이션의 요소 추가하기

     

     

    애너테이션의 요소 추가하는 건 굉장히 쉽다.

     

    인터페이스에서 추상메서드를 추가하듯이 메서드 형식으로 요소들을 추가해주면 된다.

     

    이때 enums()와 testDate()를 보도록 하자.

     

    enums()는 열거형 데이터를 타입으로 가지는 요소이며, testDate()는 다른 애너테이션을 타입으로 가진다.

     

    이처럼 애너테이션의 요소로는 단순한 문자열이나 정수 이외에도 다양한 타입의 자료가 올 수 있다.

    애너테이션 사용하기

     

    이제 애너테이션을 직접 사용해볼 차례다.

     

    이 과정을 통해 요소에 값을 추가해줄 수 있다.

     

    값은 위와 같이 추가하면 된다.

     

    애너테이션의 형태는 인터페이스이고, 추상 메서드 형태로 요소를 가진다.

     

    하지만 그럼에도 값을 추가해줄 때는 그냥 일반적인 변수를 사용하듯 등가 연산자를 사용하면 된다.

     

    그리고 이러한 요소의 값을 적어주는 것은 해당 애너테이션을 사용하기 위해선 필수임을 잊지말아야 한다.

     

    다만 매번 이렇게 애너테이션을 사용할 때마다 추가하는 것은 어떤 점에선 굉장히 불편할 수 있다.

     

    그래서 디폴트값을 미리 지정해서 편리하게 사용이 가능하다.

     

     

     

    위와 같이 default 명령어와 값을 입력해두면 별도의 값 입력없이 사용이 가능하다.

     

     

     

    애너테이션을 설정하고 사용할 때 알아두면 좋은 것 중 하나는,

     

    애너테이션이 요소를 하나 가진 상황에서 요소 이름이 value()일 경우,

     

    값을 추가할 때 요소의 이름이 생략 가능하다.

     

     

     

    value인 요소 하나만 가진 상황이므로 위에서 말한대로 요소 이름을 생략하고 값을 추가했다.

     

    그럼에도 컴파일 오류가 나지 않는 것을 볼 수 있다.

     

    실제 애너테이션들을 보면 알겠지만, 위의 예제에서 든 것처럼 많은 요소들을 가진 경우는 드물다.

     

    오히려 심플하게 가진 경우가 많다.

     

    그래서 위와 같이 하나의 요소만 가진 경우 요소 이름을 value로 바꾸는게 깔끔한 코드를 유지하기 좋다.

    애너테이션의 값을 사용하기

    이제 애너테이션들을 설정하고 요소들에 값을 추가했다면, 이 값을 가져와서 사용도 가능하다.

     

    애너테이션 객체를 얻어내는 것이 바로 그 방법인데 사용 방법은 다음과 같다.

     

     

     

    우선 이전 단락에서 설정했던 애너테이션을 바탕으로 진행할 예정이다.

     

    이때 바뀐 점이라면 DateTime 애너테이션의 디폴트 값이 추가되었다는 것.

     

    그리고 또 하나는 Test_Anno 애너테이션의 수명을 지정해줬다는 것이다.

     

     

     

    메인 메서드에 애너테이션을 붙였는데, 디폴트값을 설정한 요소를 제외한 나머지 요소의 값을 추가한다.

     

    @DateTime의 경우는 내부적으로 디폴트값이 지정되있으므로 위와 같이 선언만 해줘도 된다.

     

     

     

    이제 메인 메서드에서 첫번째 빨간줄처럼 애너테이션이 붙은 클래스의 객체를 얻어온다.

     

    그리고 두번째 줄처럼 애너테이션이 붙은 클래스의 객체에 getAnnotation()메서드를 쓴다.

     

    getAnnotation()는 해당 클래스 객체에 붙은 Annotation들의 객체를 얻어오는 메서드다.

     

    괄호 ( )안에 얻고자 하는 애너테이션의 클래스명을 입력해주면 된다.

     

    그렇게 얻은 애너테이션 객체는 해당 애너테이션 타입의 변수에 저장해주면 된다.

     

    여기선 이전에 만든 애너테이션의 이름이 "Test_Anno"이므로 변수의 데이터 타입도 "Test_Anno"로 한다.

     

     

     

    이제 static 메서드를 써주듯이 위와 같이 사용하면 된다.

     

    애너테이션의 객체를 얻어오는 과정이 조금 복잡해보일 뿐이지 그 뒤는 매우 간단하다.

    애너테이션의 조상 - java.lang.annotation.Annotation

     

    모든 애너테이션의 조상은 Annotation 인터페이스다.

     

    해당 인터페이스는 아래와 같이 세 가지 추상 메서드를 갖는다.

     

    - equals()

    - hashCode()

    - toString()

     

    그런데 조금 예외적인건 이 Annotation 인터페이스는 상속이 허용되지 않는다.

     

    그럼에도 불구하고 Annotation이 가진 메서드들은 사용이 가능하게 설정되어있다.

     

    그래서 만약 새로운 애너테이션을 만든다면 상속 과정 없이 위 세개의 메서드를 디폴트로 사용 가능하다.

    애너테이션의 요소의 규칙

    애너테이션의 규칙을 만들 때 반드시 지켜야 하는 규칙은 다음과 같다.

     

    - 요소의 타입은 기본형, String, enum, 애너테이션, class만 허용된다.

    - 괄호 ( )안에 매개변수를 선언할 수 없다.

    - 예외를 선언할 수 없다.

    - 요소를 타입 매개변수로 정의할 수 없다.

     

    대체로 직접 애너테이션을 만들 일은 없지만, 간단하게 기억해두면 좋다.

Designed by Tistory.