[TIL] 자바 어노테이션 공부

ino5·2022년 7월 23일

어노테이션에 대해 더 이해하고 싶어서 어노테이션을 직접 만들어보고 사용해봤다..!

📖 어노테이션

어노테이션이란?

  • 사전적인 의미는 주석
  • 코드 사이에 주석처럼 쓰여서 기능 수행
  • 프로그램에 추가적인 정보를 제공해주므로 메타데이터라고도 볼 수 있다.

어노테이션 용도

  • 컴파일 전 컴파일러에게 정보를 제공하여 코드 작성 문법 에러 체크
  • 컴파일 시 정보를 제공하여 코드 생성 위한 정보 제공
  • 런타임 시 정보 제공

내가 느끼는 어노테이션

  • 정보를 적어 놓은 것. 프로그램은 어노테이션이 붙은 것을 실행할 때 해당 정보를 참고할 수 있다.

📖 @Override

어노테이션 @Override

@Override 어노테이션

/**
 * Indicates that a method declaration is intended to override a
 * method declaration in a supertype. If a method is annotated with
 * this annotation type compilers are required to generate an error
 * message unless at least one of the following conditions hold:
 *
 * <ul><li>
 * The method does override or implement a method declared in a
 * supertype.
 * </li><li>
 * The method has a signature that is override-equivalent to that of
 * any public method declared in {@linkplain Object}.
 * </li></ul>
 *
 * @author  Peter von der Ah&eacute;
 * @author  Joshua Bloch
 * @jls 8.4.8 Inheritance, Overriding, and Hiding
 * @jls 9.4.1 Inheritance and Overriding
 * @jls 9.6.4.4 @Override
 * @since 1.5
 */
  • 해당 메소드가 선언된 것은 슈퍼타입에 선언된 메소드를 오버라이드 하기 위한 것이라는 것을 가리킨다.
  • 해당 어노테이션 타입으로 어노테이션 된 메소드에 대해서 다음 경우 중 하나도 충족하지 않는다면 컴파일러는 에러메시지를 발생시킨다.
    • 해당 메소드는 슈퍼타입에 선언된 메소드를 오버라이드 하거나 인터페이스 구현(implement)을 한다.
    • 해당 메소드는 Object에 선언된 public 메소드 중 하나를 오버라이드 하는 것과 같은 특징을 가진다.

@Override 코드

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
  • 해당 어노테이션은 메소드에 쓰인다.
  • 해당 어노테이션은 바이트 코드로 바뀌기 전까지만 활용된다.

@Override 사용 예시

📖 어노테이션 만들어보기

클래스 어노테이션으로 @Company, 메소드 어노테이션으로 @Star를 만들어봤다.

@Company 어노테이션으로 회사 정보를 넣었고 @Star 어노테이션은 메소드가 사용할 때 같이 출력될 *의 개수 정보를 넣었다.

package javastudy.temp.annotation.company;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE) // 클래스에 사용 가능
@Retention(RetentionPolicy.RUNTIME) // 런타임 시에도 사용 가능
public @interface Company { // @interface로 어노테이션 선언
	String name() default "ABC"; // 어노테이션을 사용할 때 name 값을 String으로 지정할 수 있고 지정하지 않으면 기본 값은 "ABC"이다.
	String city() default "XYZ"; // 어노테이션을 사용할 때 city 값을 String으로 지정할 수 있고 지정하지 않으면 기본 값은 "XYZ"이다.
}
package javastudy.temp.annotation.company;

@Company(name = "Joo")
public class Employee {
	
	private int id;
	private String name;
	
	/**
	 * 생성자
	 * @param id
	 * @param name
	 */
	public Employee(int id, String name) {
		this.id = id;
		this.name = name;
	}
	
	/**
	 * Employee 정보 출력
	 */
	public void getEmployeeDetails() {
		System.out.println("Employee Id: " + id);
		System.out.println("Employee Name: " + name);
	}
}
package javastudy.temp.annotation.company;

import java.lang.annotation.Annotation;

public class Main {
	
	public static void main(String[] args) {
		/* employee 생성 */
		Employee employee = new Employee(1, "John Doe"); // id: 1, name: John Doe
		
		/* employee 정보 출력 */
		employee.getEmployeeDetails(); // 출력: 1, John Doe
		
		/* employee의 어노테이션 Company 가져오기 */
		Annotation companyAnnotation = employee.getClass().getAnnotation(Company.class); // 클래스의 Company 어노테이션 가져오기
		Company company = (Company)companyAnnotation;
		
		/* employee의 어노테이션 Company에 지정한 값 가져오기 */
		System.out.println("Company Name: " + company.name()); // Joo
		System.out.println("Company City: " + company.city()); // XYZ
		
	}
}

출력 결과

Employee Id: 1
Employee Name: John Doe
Company Name: Jack
Company City: XYZ
**********
Employee Id: 1
Employee Name: John Doe

참고

Java에서 어노테이션(Annotation) 이란 무엇인가에 대해 알아보자.

An Introduction to Annotations and Annotation Processing in Java

Lesson: Annotations

profile
지금은 네이버 블로그만 해요... https://blog.naver.com/chero77

0개의 댓글