Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

랩터

[Java] 애너테이션 본문

카테고리 없음

[Java] 애너테이션

raptorhs 2024. 7. 4. 15:37

애너테이션은 주석과 비슷합니다. 주석은 사람에게 정보를 전달하는 반면, 너테이션은 다른 프로그램에게 정보를 전달합니다.

학습 목표

  • 애너테이션의 개념을 설명할 수 있다.
  • 표준 애너테이션을 이해하고 사용할 수 있다.
  • 메타 애너테이션이 무엇이고, 왜 필요한지 이해한다.
  • 사용자 정의 애너테이션을 정의하는 기초적인 문법을 이해한다.

애너테이션이란?

애너테이션은 소스 코드가 컴파일되거나 실행될 때 컴파일러 및 다른 프로그램에게 필요한 정보를 전달해 주는 문법 요소입니다.

 

public class ExampleClass implements ExampleInterface {
    @Override
    public void example() {

    }
}

 

@Override가 애너테이션입니다. 이 @Override는 example()이 추상 메서드를 구현하거나, 상위 클래스의 메서드를 오버라이딩한 메서드라는것을 컴파일러에게 알려주는 역할을 합니다.

 

애너테이션의 종류

JDK에서 기본적으로 제공하는 애너테이션은 아래의 두 가지로 구분됩니다.

  • 표준 애너테이션 : JDK에 내장된 일반적인 애너테이션입니다.
  • 메타 애너테이션 : 다른 애너테이션을 정의할 때 사용하는 애너테이션입니다.

애너테이션도 사용자가 직접 정의해서 사용할수 있습니다.

 

표준 애너테이션

먼저 자바가 기본적으로 제공하는 표준 애너테이션에 대해 살펴보겠습니다.

아래 소개된 것 외에 몇 가지 표준 애너테이션들이 더 있지만, 우리는 그중에서 가장 빈번하게 사용되는 네 가지를 중심으로 간략히 살펴보도록 하겠습니다.

@Override

@Override는 메서드 앞에만 붙일 수 있는 애너테이션으로, 선언한 메서드가 상위 클래스의 메서드를 오버라이딩하거나 추상 메서드를 구현하는 메서드라는 것을 컴파일러에게 알려주는 역할을 수행합니다.

 

만약, 상위 클래스(또는 인터페이스)에서 @Override 가 붙어있는 메서드명과 같은 이름의 메서드를 찾을 수 없다면 컴파일러가 컴파일 에러를 발생시킵니다. 종종 코드를 작성하다 보면 어떤 메서드를 오버라이딩하거나 구현할 때, 개발자의 실수로 메서드의 이름이 잘못 작성되는 경우가 발생합니다.

 

class SuperClass {
    public void example() {
        System.out.println("example() of SuperClass");
    }
}

class SubClass extends SuperClass {

    public void exapmle() { // 메서드 이름에 오타가 있습니다.
        System.out.println("example() of SubClass");
    }
}

 

@Override를 사용하면 example()이 오버라이딩 메서드라는 것을 컴파일러가 인지하고, 상위 클래스에 example()이 존재하는지 확인하기 때문에, 이러한 상황을 방지할 수 있습니다.

즉, @Override는 컴파일러에게 “컴파일러야, 이 메서드는 상위 클래스의 메서드를 오버라이딩하거나 추상 메서드를 구현하는 메서드인데, 만약에 내가 실수해서 오버라이딩 및 구현이 잘 안 되면 에러를 발생시켜서 나에게 알려줄래?”라고 부탁하는 것과 같습니다.

 

 

@Deprecated

@Deprecated는 기존에 사용하던 기술이 다른 기술로 대체되어 기존 기술을 적용한 코드를 더 이상 사용하지 않도록 유도하는 경우에 사용합니다.

 

@SuppressWarnings

@SuppressWarnings 애너테이션은 컴파일 경고 메시지가 나타나지 않도록 합니다. 때에 따라서 경고가 발생할 것이 충분히 예상됨에도 묵인해야 할 때 주로 사용합니다.

 

@FunctionalInterface

@FunctionalInterface 애너테이션은 함수형 인터페이스를 선언할 때, 컴파일러가 함수형 인터페이스의 선언이 바르게 선언되었는지 확인하도록 합니다. 만약 바르게 선언되지 않은 경우, 에러를 발생시킵니다.

 

 

메타 애너테이션

  • 메타 애너테이션(meta-annotation)은 애너테이션을 정의하는 데에 사용되는 애너테이션으로, 애너테이션의 적용 대상 및 유지 기간을 지정하는 데에 사용됩니다.

 

@Override의 소스코드는 아래와 같습니다.

애너테이션 정의부 상단에 @Target, @Retention 애너테이션이 붙어 있는 것을 확인할 수 있습니다. 이들은 @Override의 적용 대상과 유지 기간을 지정하는 역할을 합니다.

@Target

@Target 애너테이션은 이름 그대로 애너테이션을 적용할 “대상"을 지정하는 데 사용됩니다.

 

@Documented

다음으로 @Documented 애너테이션은 애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 하는 애너테이션 설정입니다.

 

@Inherited

@Inherited 애너테이션은 이름에서도 알 수 있듯이 하위 클래스가 애너테이션을 상속받도록 합니다. @Inherited 애너테이션을 상위 클래스에 붙이면, 하위 클래스도 상위 클래스에 붙은 애너테이션들이 동일하게 적용됩니다.

 

@Retention

@Retention 애너테이션도 이름 그대로 특정 애너테이션의 지속 시간을 결정하는 데 사용합니다.

 

@Repeatable

@Repeatable 애너테이션은 애너테이션을 여러 번 붙일 수 있도록 허용한다는 의미가 있습니다.

 

사용자 정의 애너테이션

사용자 정의 애너테이션은 이름 그대로 사용자가 직접 애너테이션을 정의해서 사용하는 것을 의미합니다.

애너테이션을 정의하는 방법은 인터페이스를 정의하는 것과 비슷합니다.

@interface 애너테이션명 { // 인터페이스 앞에 @기호만 붙이면 애너테이션을 정의할 수 있습니다.
	타입 요소명(); // 애너테이션 요소를 선언
}

한 가지 유의할 점은, 애너테이션은 java.lang.annotation 인터페이스를 상속받기 때문에 다른 클래스나 인터페이스를 상속받을 수 없다는 사실입니다.