에노테이션(@)은 주석이라는 의미를 가진다.
자바 소스 코드에 사이에 @ 기호를 앞에 붙여서 사용하는데, JDK 1.5 버전 이상에서 사용 가능하다.
- 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
- 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공
- 실행시(런타임시)특정 기능을 실행하도록 정보를 제공
자바 코드에 적용되는 대표적인 내장 어노테이션
- @Override
선언한 메서드가 오버라이드 되었다는 것을 나타낸다.
만약 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생 시킨다.class Parent{ void parentMethod(){} } class Child extends Parent{ void parentmethod(){} // 오버라이딩하려 했으나 실수로 이름을 잘못적음 // 새로운 메서드가 만들어진 것 } ------- class Child extends Parent{ //메소드 선언부 앞에 오버라이딩을 하면 위의 문제를 방지할 수 있다. @Override void parentMethod(){ } }
- @SuppressWarnings
선언한 곳의 컴파일 경고를 무시하도록 한다.// unchecked 경고를 억제 @SuppressWarnings("unchecked") ArrayList list = new ArrayList(); // 지네릭 클래스는 원시타입 쓸 수 없지만, 지정해주지 않음 list.add(obj); // 여기서 경고 발생
- @FunctionalInterface
함수형 인터페이스를 지정하는 어노테이션이다.
만약 메서드가 존재하지 않거나, 1개 이상의 메서드(default 메서드 제외)가 존재할 경우 컴파일 오류를 발생 시킨다.@FunctionalInterface public interface Runnable{ public abstract void run(); // 추상메서드 }
어노테이션 생성
@interface 이름{ 타입 요소 이름(); // 어노테이션의 요소를 선언 ... }
사용 예시
@interface DateTime{ String yymmdd(); String hhmmss(); } @interface TestInfo{ int count() default 1; String testedBy(); TestType testType(); DateTime testDate(); } @TestInfo{ testedBy="Hwang", testTools={"JUnit", "AutoTester"}, testType=TestType.FIRST, testDate=@DateTime(yymmdd="230613", hhmmss="165418") )// count를 생략했으므로 default인 "count=1"이 적용된다. public class NewClass{...}
- 적용시 값을 지정하지 않으면, 사용될 수 있는 기본값을 지정할 수 있다.(위의 default)
- 요소가 하나이고 이름이 value일 때는 요소의 이름 생략 가능하다.
- 요소의 타입이 배열인 경우, 괄호{ }를 사용해야 한다.
https://velog.io/@jkijki12/annotation
어노테이션에도 반드시 지켜주어야 하는 4가지 규칙이 있다.
- 요소의 타입은 기본형, String, enum, 어노테이션, Class만 허용된다.
- 괄호()안에 매개변수를 선언할 수 없다.
- 예외를 선언할 수 없다.
- 요소의 타입을 매개변수로 정의할 수 없다.(< T >)