-
[Java] 어노테이션(Annotation)Java 2021. 12. 20. 19:59728x90
평소에 어노테이션이라는 말은 많이 듣고 코드에서도 종종 활용되는 모습을 보았는데 전혀 알지 못해서 정리합니다.
자바 어노테이션(Java Annotaion)이란?
어노테이션, 애노테이션이라고도 불리며 사전적 의미로 'Annotation'은 주석이라는 의미이다.
JDK1.5 버전 이상에서 사용이 가능하며 @기호를 앞에 붙여 사용합니다.
가장 많이 봤던 @Override와 같은 @표시가 이를 의미합니다.
우리가 흔히 사용하는 주석은 // , /**/ 등이 있는데 이것과 무엇이 다를까요?
단순한 설명을 넘어 특별한 의미, 특별한 기능을 수행하도록 하는 기술입니다.
프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것으로, 즉 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있습니다.
메타데이터란?
데이터를 위한 데이터
어노테이션의 등장 배경
어노테이션이 등장하기 전에는 프로그램 소스코드와 프로그램 설정 파일(.xml 등)을 따로 작성했기 때문에, 코드와 설정파일 분리에 어려움이 있었습니다.
또한 프로젝트를 여러 사람이 함께 참여하는 경우에 모든 프로그래머가 설정 정보를 공유해야 하는데, xml 파일을 사용할 경우 많은 사람이 하나의 xml 파일을 두고 사용하기 때문에 사용/수정하기에 어려움이 있었습니다.
따라서 프로그램 소스코드에 어노테이션을 활용하여 이를 해결하고자 했습니다.
어노테이션의 활용
전체 소스코드에서 비즈니스 로직에는 영향을 주지는 않지만 해당 타깃의 연결 방법이나 소스코드의 구조를 변경할 수 있습니다.
예를 들어 '@Test'라는 어노테이션을 메서드 앞에 붙인다면 이는 테스트 프로그램에게 이 메서드를 테스트해야 한다는 것을 테스트 프로그램에게 알리는 역할을 하지만 프로그램 자체에는 아무런 영향을 미치지 않습니다.
'@Test'는 테스트 프로그램을 제외한 다른 프로그램에게는 아무런 의미가 없는 정보이고 테스트 프로그램에게는 테스트할 메서드를 일일이 알려주지 않고, 해당 메서드 앞에 어노테이션만 붙이면 되기 때문에 편리함을 제공합니다.
예를 들어 "@Override'라는 어노테이션을 메서드 앞에 붙이지 않는다면 코드에서 조상의 메서드의 이름을 잘못 써도 컴파일러는 이것이 잘못 써진 것이라고 인식하지 못하고 새로운 메서드라고 인식한다. 하지만 어노테이션을 활용한다면 컴파일러가 같은 이름의 메서드가 조상에 있는지 확인하고 없다면 에러 메시지를 출력합니다.
어노테이션의 구조
다음은 예를 위해 작성된 커스텀 어노테이션입니다.
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface CustomAnnotation { boolean isCheck() default true; }
@Target과 @Retention은 메타 어노테이션이라 하며 어노테이션을 위한 어노테이션으로써 어노테이션의 적용대상(targer) 또는 유지기간(retention)등을 지정하는 데 사용됩니다.
@Target는 어노테이션이 적용할 위치를 선택합니다.
종류로는 PACAKGE, TYPE, FIELD, METHOD 등 다양한 종류가 있습니다.
@Retention는 자바 컴파일러가 어노테이션이 어느 시점까지 영향을 미치는지를 결정합니다.
종류료는 SOURCE, CLASS, RUNTIME 등이 있습니다.
어노테이션은 @기호를 제외하면 인터페이스를 정의하는 것과 동일합니다.
어노테이션을 적용할 때는 이 요소들의 값을 빠짐없이 지정해주어야 하며 default를 사용하여 기본값을 가질 수 있습니다.
만약 기본값을 가지고 있다면 요소들의 값을 지정해주지 않았을 경우에 기본값이 사용됩니다.
오늘은 대략적으로 어노테이션이란 이런 거구나 정도로만 알아보았는데 실제로 사용할 일이 생긴다면 조금 더 깊게 작성해보도록 하겠습니다.
출처
https://www.nextree.co.kr/p5864/
https://honeyinfo7.tistory.com/56
https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EC%95%A0%EB%84%88%ED%85%8C%EC%9D%B4%EC%85%98
https://elfinlas.github.io/2017/12/14/java-annotation/
'Java' 카테고리의 다른 글
[Java] 자바 Enum이란? (0) 2022.01.01 [Java] 제네릭/지네릭스(Generics)란? (0) 2021.12.30 [Java] 인터페이스(Interface) (0) 2021.12.16 [Java] 추상클래스(Abstract Class) (0) 2021.12.15 [Java] 배포란?(+ CI/CD) (0) 2021.12.03