소스 코드가 컴파일되거나 실행될 때에 컴파일러 및 다른 프로그램에게 필요한 정보를 전달해주는 문법 요소
public interface ExampleInterface {
void example();
}
public class ExampleClass implements ExampleInterface{
@Override
public void example() {
}
}
@Override가 애너테이션이다.
애너테이션은 @로 시작하며, 클래스, 인터페이스, 필드, 메서드 등에 붙여서 사용할 수 있다.
예시에서 @Override는 example()이 추상 메서드를 구현하거나, 상위 클래스의 메서드를 오버라이딩한 메서드라는 것을 컴파일러에게 알려주는 역할이다.
결론 : 애너테이션은 컴파일러 또는 다른 프로그램에게 필요한 정보를 제공해주는 역할을 수행함
JDK가 기본적으로 제공하는 애너테이션도 있지만, 다른 프로그램에서 제공하는 애너테이션도 있따.
JDK에서 기본적으로 제공하는 애너테이션
1. 표준 애너테이션 : JDK에 내장되어 있는 일반적인 애너테이션
2. 메타 애너테이션 : 다른 애너테이션을 정의할 때 사용하는 애너테이션
표준 애너테이션 - 다른 문법 요소에 붙여서 사용하는 일반적인 애너테이션을 의미
메타 애너테이션 - 애너테이션을 직접 정의해서 사용할 때에 사용하는 애너테이션
사용자 정의 애너테이션 - 사용자가 직접 정의해서 사용하는 애너테이션
class SuperClass {
public void example() {
System.out.println("example() of SuperClass");
}
}
class SubClass extends SuperClass {
@Override
public void example() {
System.out.println("example() of SubClass");
}
}
컴파일 과정에서 컴파일러가 @Override를 발견하면, @Override가 붙은 메서드와 동일한 이름을 가진 메서드가 상위 클래스(또는 인터페이스)에 존재하는지 검사한다.
만약, 상위 클래스(또는 인터페이스)에서 @Override가 붙어있는 메서드명과 동일한 이름의 메서드를 찾을 수 없다면 컴파일러가 컴파일 에러를 발생시킨다.
@Override를 사용하는 이유 - 개발자의 실수로 메서드의 이름을 잘못 입력했을 때 @Override를 붙이지 않으면 컴파일러는 새로운 메서드를 정의하는 것으로 간주하고 에러를 발생 시키지 않음.
@Override는 컴파일러에게 “컴파일러야, 이 메서드는 상위 클래스의 메서드를 오버라이딩하거나 추상 메서드를 구현하는 메서드인데, 만약에 내가 실수해서 오버라이딩 및 구현이 잘 안되면 에러를 발생시켜서 나에게 알려줄래?”라고 부탁하는 것과 같다.
public class OldClass {
@Deprecated
private int oldField;
@Deprecated
int getOldField() {
return oldField;
}
}
public static void main(String[] args) throws IOException {
OldClass oldClass = new OldClass();
System.out.println(oldClass.getOldField());
}
@Deprecated는 애너테이션이 붙은 대상이 새로운 것으로 대체되었으니 기존의 것을 사용하지 않도록 유도하는 기능이다.
결론 : 기존의 코드를 다른 코드와의 호환성 문제로 삭제하기 곤란해 남겨두어야만 하지만 더 이상 사용하는 것을 권장하지 않을 때에 @Deprecated를 사용한다
@SuppressWarnings 뒤에 괄호를 붙이고 그 안에 억제하고자 하는 경고메세지를 지정할 수 있다.
중괄호에 여러 개의 경고 유형을 나열함으로써 여러 개의 경고를 한번에 묵인할수도 있다.
@SuppressWarnings({"deprecation", "unused", "null"})
함수형 인터페이스는 단 하나의 추상 메서드만을 가져야하는 제약이 있다.
@FunctionalInterface
public interface ExampleInterface {
public abstract void example(); // 단 하나의 추상 메서드
}