[인프런 워밍업 클럽] BE 0기 1일차 과제

자바를 사용하다보면 메서드나 클래스명 위에 @가 붙은 것들을 많이 보았을 것 이다. ex) @Override

Override가 재정의라는것은 알고 있지만 도대체 @가 붙은 게 무엇이고 무슨 기능을 할까?

지금부터 어노테이션에 대해 알아보도록 하자.

 

어노테이션 이란?

어노테이션은 사전적 의미로는 주석이라는 뜻이다. 자바에서 사용될 때의 어노테이션은 코드 사이에 주석처럼 쓰여서 특별한 의미, 기능을 수행하도록 하는 기술이다. 즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터(meta data: 데이터를 위한 데이터)라고 볼 수 있다.

 

어노테이션을 사용하는 이유 (효과) 는 무엇일까? 

  • 컴파일러에게 문법 에러를 체크하도록 정보를 제공한다.

  • 프로그램을 빌드할 때 코드를 자동으로 생성할 수 있도록 정보를 제공한다.

  • 런타임에 특정 기능을 실행하도록 정보를 제공한다.

  • 어노테이션은 @를 사용하여 작성하며, 해당 타겟에 대한 동작을 수행하는 프로그램 외에는 다른 프로그램에게 영향을 주지 않는다.

 

나만의 어노테이션은 어떻게 만들 수 있을까?

커스텀 어노테이션을 만들 때 몇 가지 규칙이 있습니다.

  1. 어노테이션 타입은 @interface로 정의해야합니다. 모든 어노테이션은 자동적으로 java.lang.Annotation 인터페이스를 상속하기 때문에 다른 클래스나 인터페이스를 상속 받으면 안됩니다.

  2. 파라미터 멤버들의 접근자는 public이거나 default여야만 합니다.

  3. 파라미터 멤버들은 byte,short,char,int,float,double,boolean,의 기본타입과 String, Enum, Class, 어노테이션만 사용할 수 있습니다.

  4. 클래스 메소드와 필드에 관한 어노테이션 정보를 얻고 싶으면, 리플렉션만 이용해서 얻을 수 있습니다. 다른 방법으로는 어노테이션 객체를 얻을 수 없습니다.

 

최초 어노테이션 생성

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationIcon {
    String strategy() default "+";
}


@Target

  • 어노테이션을 어떤 것에 적용할지를 선언할 때 사용

  • @Target()괄호 안에 적용 대상을 지정

@Retention

  • 얼마나 오래 어노테이션 정보가 유지되는지 선언

  • 괄호 안에 적용 대상 지정


    어노테이션을 적용할 클래스

    public class CalculatorService {
    
        @OperationIcon
        public void add(int a, int b) {
            OperationIcon annotation;
            try {
                annotation = getClass().getMethod("add", int.class, int.class).getAnnotation(OperationIcon.class);
                System.out.println(a + " " + annotation.strategy() + " " + b);
                System.out.println("Result: " + (a + b));
            } catch (NoSuchMethodException e) {
                throw new RuntimeException(e);
            }
        }
    
        @OperationIcon(strategy = "-")
        public void subtract(int a, int b) {
            OperationIcon annotation;
            try {
                annotation = getClass().getMethod("subtract", int.class, int.class).getAnnotation(OperationIcon.class);
                System.out.println(a + " " + annotation.strategy() + " " + b);
                System.out.println("Result: " + (a - b));
            } catch (NoSuchMethodException e) {
                throw new RuntimeException(e);
            }
        }
    }

     

Main 실행

public class TestMain {
    public static void main(String[] args) {

        CalculatorService calculator = new CalculatorService();
        calculator.add(5, 3);
        calculator.subtract(10, 4);
    }
}

 

댓글을 작성해보세요.