프로그래밍 공부/JAVA

애너테이션(어노테이션)

Wonuk 2021. 12. 5. 21:05
반응형

 포스팅은 유튜브 자바의 정석 - 기초편 강의에 기반하여 작성되었습니다.

자바 강의의 모든 내용이 적힌것이 아닌 복습시 놓쳤던 부분을 하나하나 정리한 내용입니다.
https://www.youtube.com/watch?v=i4V8ZI9Undc

애너테이션이란?

 - 주석처럼 프로그래밍 언어에 영향을 미치지 않으며, 유용한 정보를 제공

 

예전으로..

 

이전에는 .java파일과 그에대한 설명이 적힌 문서 파일을 따로 생성했어야만 했다.

주석의 탄생배경

java파일이 ver1.5로 변경되었는데 개발자의 실수로 문서의 버전은 ver1.1인채로 머물러있게 되는 상황이 생긴다.

결국 관리가 되지않는 현상이 발생합니다. 그래서 두가지를 합쳐서 하나로 만들게됩니다.(javadoc.exe)

 

애너테이션의 탄생 배경

 

소스코드 (.java)와 설정파일(xml)이 있었는데 따로 분리되어 있다보니 어려움이 생겨

두개를 합치기위해 만들어진것이 애너테이션 입니다.

 

애너테이션은 특정 프로그램에게 정보 제공을 하기위한 것입니다. ex)설정정보 xml

xml의 또다른 문제는 여러 사람이 공유해야 합니다.

그런데 애너테이션을 사용하면 각자 자기프로그램에 필요한 설정정보를 애너테이션을 사용하면됩니다.

 

장점

문법을 바꾸지 않아도 된다.

ex) @Test = JUnit이라는 특정 프로그램을 의미 해당 프로그램에서만 유효함

 

아래의 /**~*/ 이 Javadoc.exe라는 프로그램을 위한 주석입니다 아래는 소스코드가 나타납니다.
그 안에서도 @애너테이션이 사용됩니다.

Annotation.java

 

 


애너테이션의 사용예

JUnit 단위테스트 프로그램

테스트 대상임과 아닌것을 @Test로 구분합니다.

@Test // 이 메서드가 테스트 대상임을 테스트 프로그램에게 알린다.
public void method() {
	메소드내용
}

이처럼 프로그래밍 언어에 영향을 미치지 않으며, 특정 프로그램에게 유용한 정보를 제공합니다.

 


표준 애너테이션

- Java에서 제공하는 애너테이션

메타 애너테이션 이란?

애너테이션을 만들때 사용하는 애너테이션 입니다.

 

표준 애너테이션 소개

 

@Override

 - 오버라이딩을 올바르게 했는지 컴파일러가 체크하게 한다

 - 오버라이딩할 때 메서드이름을 잘못적는 실수를 하는 경우를 체크해준다.

오버라이딩할 때는 메서드 선언부 앞에 @Override를 붙이는것이 좋습니다.

 

@Deprecated

 - 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙인다.

 - 문제가 발생한다던가 더 좋은게 나와있다면 해당 애너테이션을 붙입니다.

 - 하위 호환성을 위해 남겨두기 위해 사용합니다.

 - @Deprecated의 사용 예, Date클래스의  getDate()

 - 해당 애너테이션이 붙은 메서드를 사용하면 Warning이 발생합니다.

 

@FunctionalInterface

 - 함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지 체크

   함수형 인터페이스에는 하나의 추상메서드만 가져야 한다는 제약이 있습니다.(람다관련)

 

@SuppressWarnings

 - 컴파일러의 경고메시지가 나타나지 않게 억제한다.

 - 괄호()안에 억제하고자 하는 경고의 종류를 문자열로 지정

@SuppressWarnings("unchecked") // 지네릭스와 관련된 경고를 억제
ArrayList list = new ArrayList(); // 지네릭 타입을 지정하지 않았음.
list.add(obj);	// 여기서 경고가 발생

 - 괄호()안에 ',' 콤마를 구분자로 사용하여 여러가지를 넣을수 있습니다.

 


메타 애너테이션

 - 애너테이션을 위한 애너테이션

 - java.lang.annotation 패키지에 포함

 

 

메타 애너테이션 소개

 

@Target - 중요

 - 애너테이션을 정의할 때 적용대상 지정에 사용

 

@Retention - 중요

 - 애너테이션이 유지(retention)되는 기간을 지정하는데 사용

 - 컴파일러에 의해 사용되는 애너테이션의 유지 정책은 SOURCE이다. 

 

@Documented, @Inherited

- javadoc으로 작성한 문서에 포함시키려면 @Documented를 붙인다.

 

- 애너테이션을 자손 클래스에 상속하고자 할 때, @Inherited를 붙인다.

 

@Repeatable

 - 반복해서 붙일 수 있는 애너테이션을 정의할 때 사용

 - @Repeatable인 애너테이션을 하나로 묶을 컨테이너 애너테이션도 배열로 정의해야 함

 


애너테이션 타입 정의하기

애너테이션을 직접 만들어 쓸 수 있습니다.

@interface 애너테이션이름 {
	타입요소이름(); // 애너테이션의 요소를 선언한다.
    	...
}

// ex)
@interface DateTime {
	String yymmdd();
	String hhmmss();
}

- 애너테이션의 메서드는 추상 메서드이며, 애너테이션을 적용할 때 지정(순서X)


애너테이션의 요소

 - 적용시 값을 지정하지 않으면, 사용될 수 있는 기본값 지정 가능(null제외)

@interface TestInfo {
	int count() default 1; // 기본값을 1로 지정
}

@TestInfo // @TestINfo(count=1)과 동일
public class NewClass (...)

 

 - 요소가 하나이고 이름이 value 일때는 요소의 이름 생략가능

@interface TestInfo{
	String value();
}

@TestInfo("passed") // @TestINfo(value="passed")와 동일
class NewClass{ ... }

 

 - 요소의 타입이 배열인 경우, 괄호{}를 사용해야 한다. + default값 추가가능, 하나일때 생략가능

@interface TestInfo {
	String[] testTools();
}

@Test(testTools={"JUnit", "AutoTester"})
@Test(testTools={}) // 값이 없을때는 빈괄호 반드시 필요

값이 없을때는 빈괄호 반드시 필요

 


모든 애너테이션의 조상


마커 애너테이션

 


애너테이션 요소의 규칙

 - 요소의 타입은 기본형, String, enum, 애너테이션, Class(설계도 객체)만 허용됨

 - 괄호()안에 매개변수를 선언할 수 없다.

 - 예외를 선언할 수 없다.

 - 요소를 타입 매개변수로 정의할 수 없다.(<T>)

 

 

반응형