Java Annotation

박지훈·2020년 12월 30일
0

Java Annotation

  • Annotation (@)은 사전적 의미로 '주석'이다. --> Java에서 @를 이용한 주석이다.

  • Java 코드에 주석을 달아 특별한 의미를 부여한 것이며 특별한 기능을 수행하도록 하는 기술이다. (클래스, 메소드, 변수 등 모든 요소에 선언이 가능함)
    --> 즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고도 볼 수 있다.

  • JDK5 부터 등장하였다. Java, Spring이 제공해주는 것도 있고, 사용자가 직접 정의하여 만들 수 있다.



용도

  • @Override 어노테이션처럼 컴파일러를 위한 정보를 제공하기 위한 용도
    --> 컴파일러에게 정보(코드 작성 문법 에러 등)를 제공한다.
    --> 컴파일 과정에 어노테이션 정보로부터 코드를 생성하기 위한 용도이다.

  • SW 개발 툴이 빌드나 배치를 수행할 때 코드를 자동으로 생성할 수 있도록 정보를 제공한다.

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


기본적으로 Annotation을 사용하는 순서는 다음과 같습니다.

  1. Annotation 정의
  2. 클래스에 Annotation 배치 (꼭 클래스가 아니여도 된다.)
  3. 코드가 실행되는 중에 Reflection을 이용하여 추가 정보를 획득하여 기능을 실시힌다.



Reflection

  • 프로그램이 실행 중에 자신의 구조와 동작을 검사하고, 조사하고, 수정하는 것을 의미한다.

  • 프로그래머가 데이터를 보여주고, 다른 포맷의 데이터를 처리하고, 통신을 위해 직렬화를 수행하고, bundling을 하기 위해 일반 SW 라이브러리를 만들도록 도와준다.

  • 객체 지향 프로그래밍 언어인 Java에서 Reflection을 사용하면 컴파일 타임에 인터페이스, 필드, 메소드 이름을 알지 못하여도 실행 중에 클래스, 인터페이스, 필드 및 메소드에 접근할 수 있다.
    또한, 멤버 접근지정자 규칙을 무시할 수 있다.
    (Ex) Reflection 사용 시 서드 파티 라이브러리의 클래스에서 private 필드의 값을 변경할 수 있다.

Spring에서 BeanFactory라는 Container에서 객체가 호출되면 인스턴스를 생성하게 되는데 이 때 필요하게 된다. 즉, Framework에서 유연성있는 동작을 위해 Reflection이 쓰인다.

Annotation 자체는 아무런 동작을 가지지 않는 단순한 표식이지만, Reflection을 이용하면 Annotation의 적용 여부와 엘리먼트 값을 읽고 처리할 수 있다.

Class에 적용된 Annotation 정보를 읽으려면 java.lang.Class를 이용하고 필드, 생성자, 메소드에 적용된 Annotation 정보를 읽으려면 Class의 메소드를 통해 java.lang.reflect 패키지의 배열을 얻어야한다. --> Class.forName(), getName(), getModified(), getFields(), getPackage() 등등 여러 메소드로 정보를 얻을 수 있다.

Reflection을 이용하면 Annotation 지정만으로도 원하는 클래스를 주입할 수 있다.

// Without reflection
Foo foo = new Foo();
foo.hello();


// With reflection
Object foo = Class.forName("complete.classpath.and.Foo").newInstance();
// Alternatively: Object foo = Foo.class.newInstance();
Method m = foo.getClass().getDeclaredMethod("hello", **new** Class<?>[0]);
m.invoke(foo);

Java Annotation에 대해 간단히 정리해보았습니다. 프로그래밍 기술 원리를 공부하는 것은 굉장히 어렵습니다.ㅠㅠ 또한, Java Annotation의 종류에 대한 공부의 필요성을 느꼈습니다...



출처 :
https://helloworld-88.tistory.com/147
https://velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC
https://palyoung.tistory.com/72
https://milkshake91.tistory.com/5
https://honeyinfo7.tistory.com/56
https://qssdev.tistory.com/27

profile
Computer Science!!

0개의 댓글