일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 리눅스 사용권한
- RestControllerAdvice
- O(log n)
- 스키마 디자인
- root passwd
- custom exception
- Java
- 자료구조
- Spring
- file i/o
- 탐욕 알고리즘
- mapstruct
- 스키마 설계
- Spring MVC
- git workflow
- 배열 탐색
- git 설정
- 코드스테이츠
- 함수형 인터페이스
- ubuntu passwd
- char to int
- REST HTTP API
- set-version
- ubuntu
- N:N
- AOP
- http 응답코드
- Spring 예외처리
- ubuntu 패스워드
- JAVA 재귀함수
Archives
- Today
- Total
개발소설
[JAVA] 애너테이션 (Annotation) 본문
애너테이션 (Annotation)
- 소스 코드가 컴파일 되거나 실행될 때에 컴파 일러 및 다른 포르그램에게 필요한 정보를 전달해주는 문법 요소
- 주석과 같이 정보 전달을 위한 목적으로 만들어짐
- 주석은 개발자, 사람에게
- 애너테이션은 다른프로그램에게 정보를 전달
// @로 시작, 클래스, 인터페이스, 필드, 메서드등에 붙여서 사용 가능
public interface ExampleInterface{
void example();
}
public class ExampleCalss implements ExampleInterface{
@Override // 애너테이션
public void example() {
}
}
애너테이션의 종류
- 표준 애너테이션 : JDK에 내장되어 있는 일반적인 애너테이션 - @Override
- 메타 애너테이션 : 다른 애너테이션을 정의할 때 사용하는 애너테이션
- 사용자 정의 애너테이션 : 사용자가 직접 정의하여 사용하는 애너테이션
표준 애너테이션
- @Override : 선언한 메서드가 상위 클래스의 메서드를 오버라이딩하거나 추상 메서드를 구현하는 메서드
- @Deprecated : 사용하던 코드가 다른 코드로 대체되어 더이상 사용 하지 않도록 유도하는 경우
- @SuppressWarnings : 컴파일 경고 메시지가 나타나지 않도록 사용, 경고를 예상하지만 묵인
- @SuppressWarnings("all") : 모든 경고 억제
- @SuppressWarnings("all")
- @FunctionalIterface : 함수형 인터페이스의 선인이 제대로 되어있는지 확인 하는 경우 사용, 아니라면 에러 발생
package Annotation;
public class StandardEx {
public static void main(String[] args) {
OldClass oldClass = new OldClass();
oldClass.getOldField(); // 인텔리제이에서 경고 발생
// 더이상 사용하지 않는 코드
}
}
class SuperClass {
public void example(){
System.out.println("example() of SuperClass.");
}
}
class SubClass extends SuperClass{
@Override // 오버라이드 확인
public void example() {
super.example();
}
}
class OldClass{
@Deprecated // 더 이상 사용하지 않는 코드
private int oldField;
@Deprecated // 더 이상 사용하지 않는 코드
void getOldField(){}
}
@FunctionalInterface // 인터페이스 확인
interface InterEx{
public abstract void example();
}
메타 애너테이션
- @interface로 메타 애너테이션 생성 가능
@interface MetaAnno {
}
- @Target : 애너테이션을 적용할 대상을 지정
- java.lang.annotation.ElementType이라는 열거형에 정의 되어 있다.
- @Target({FIELD, TYPE, METHOD}) - 여러개를 지정 할 수 있다.
대상 타입 | 적용범위 |
ANNOTATION_TYPE | 애너테이션 |
CONSTRUCTOR | 생성자 |
FIELD 필드 | 필드(멤버변수, 열거형 상수) |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE 타입 | 타입(클래스, 인터페이스, 열거형) |
TYPE_PARAMETER | 타입 매개변수 |
TYPE_USE | 타입이 사용되는 모든 대상 |
- @Documented : javadoc으로 작성한 문서에 포함되도록 하는 애너테이션 설정
- @Inherited : 하위 클래스가 애너테이션을 상속 받도록 한다.
- @Retention : 애너테이션의 지속 시간을 결정
유지 정책 | 설명 |
SOURCE | 소스 파일에 존재, 클래스파일에는 존재하지 않음 |
CLASS | 클래스 파일에 존재, 실행시에 사용불가, 기본값 |
RUNTIME | 클래스 파일에 존재, 실행시에 사용가능 |
- @Repeatable : 애너테이션을 여러번 붙일 수 있도록 허용
// 애너테이션 생성
package Annotation;
import java.lang.annotation.*;
@Retention(RetentionPolicy.SOURCE) // 컴파일시에만 확인하고 사라진다.
@Inherited // 해당 애너테이션을 상위 클래스가 사용한다면 하위클래스에도 동일 하게 적용
@Documented // javadoc로 작성한 문서에 포함
@Target({ElementType.METHOD, ElementType.TYPE}) // 메서드와 타입(클래스, 인터페이스, 열거형)에 사용가능
@interface MetaAnno {
String value();
}
// 애너테이션 생성
package Annotation;
import java.lang.annotation.*;
@interface Works { // 여러개의 Work애너테이션을 담을 컨테이너 애너테이션 Works
Work[] value();
}
@Repeatable(Works.class) // 컨테이너 애너테이션 지정
@interface Work {
String value();
}
// 적용
package Annotation;
import java.lang.annotation.Repeatable;
@MetaAnno("class annotation")
@Work("first annotation") // @Repeatble에 의해 두개
@Work("Second annotation") // @Repeatable에 의해 두개
public class MetaEx {
@MetaAnno("method annotation")
public static void main(String[] args) {
}
}
@MetaAnno("super")
class Super {}
class Sub extends Super{} // @Inherited에 의해 @MetaAnno("super") 애너테이션이 붙은것으로 인식
사용자 정의 애너테이션
- 사용자가 직접 애너테이션을 정의
@interface 애너테이션명 { // 인터페이스 앞에 @기호만 붙이면 애너테이션을 정의할 수 있습니다.
타입 요소명(); // 애너테이션 요소를 선언
}
- 애너테이션은 java.lang.annotation 인터페이스를 상속받기 때문에 다른 클래스나 인터페이스를 상속 받을 수 없다
'자바' 카테고리의 다른 글
[JAVA] 파일 입출력(I/O) (0) | 2023.03.09 |
---|---|
[JAVA] 람다 (Lambda) (0) | 2023.03.08 |
[JAVA] 컬렉션 프레임 워크 (Collection Framework) (0) | 2023.03.08 |
[JAVA] 예외 처리(Exception Handling) (0) | 2023.03.07 |
[JAVA] 제네릭 (Generic) (0) | 2023.03.07 |
Comments