Backend/Java

[Java의 정석] - 애노테이션(Annotation)

박상윤 2024. 4. 25. 05:55

2024/04/25(목)

애너테이션이란?

 

프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것이 애너테이션이다.

애너테이션은 주석처럼 프로그래밍 언어에 영향을 미치지 않으면서도 다른 프로그램에게 유용한 정보를 제공할 수 있다는 장점이 있다.

애너테이션(annotation)의 뜻은 주석, 주해, 메모이다.

 

ex)

자신이 작성한 소스코드 중에서 특정 메서드만 테스트하기를 원한다면, 다음과 같이 @Test라는 애너테이션을 메서드 앞에 붙인다.

@Test는 이 메서드를 테스트해야 한다는 것을 테스트 프로그램에게 알리는 역할을 할 뿐, 메서드가 포함된 프로그램 자체에는 아무런 영향을 미치지 않는다. 주석처럼 존재하지 않는 것이나 다름없다.

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

 

테스트 프로그램에게 테스트할 메서드를 일일이 알려주지 않고, 해당 메서드 앞에 애너테이션만 붙이면 된다는 점이 얼마나 편리한가.!

그렇다고 모든 프로그램에게 의미가 있는 것은 아니고, 해당 프로그램에 미리 정의된 종류와 형식으로 작성해야만 의미가 있다.

@Test는 테스트 프로그램을 제외한 다른 프로그램에게는 아무런 의미가 없는 정보일 것이다.

 

JDK에서 제공하는 표준 애너테이션은 주로 컴파일러를 위한 것으로 컴파일러에게 유용한 정보를 제공한다.

새로운 애너테이션을 정의할 때 사용하는 메타 애너테이션을 제공한다.

 

표준 애너테이션

자바에서 기본적으로 제공하는 애너테이션들은 몇 개 없다. 그나마 이들의 일부는 메타애너테이션으로 애너테이션을 정의하는데 사용되는 애너테이션의 애너테이션이다.

@Override

메서드 앞에만 붙일 수 있는 애너테이션으로, 조상의 메서드를 오버라이딩하는 것이라는 걸 컴파일러에게 알려주는 역할을 한다.

아래 코드와 같이 오버라이딩할 때 조상 메서드의 이름을 잘못 써도 컴파일러는 이것이 잘못된 것인지 알지 못한다.

class Parent {
	void parentMethod() {}
}

class Child extends Parent {
	void parentmethod() {} // 오버라이딩하려 했으나 실수로 이름을 잘못적음
}

 

오버라이딩 할때 메서드의 이름을 잘못 적어도, 컴파일러는 새로운 이름의 메서드가 추가한 것으로 인식할 뿐, 실행 시에도 오류가 발생하지 않고 조상의 메서드가 호출되므로 어디서 잘못되었는지 알아내기 어렵다.

 

class Child extends Parent {
	@Override
    	void parentmethod() {}
}

 

메서드 앞에 @Override라고 애너테이션을 붙이면, 컴파일러가 같은 이름의 메서드가 조상에 있는지 확인하고 없으면, 에러메시지를 출력한다.

오버라이딩 할 때 메서드 앞에 @Override를 붙이는 것이 필수는 아니지만, 알아내기 어려운 실수를 미연에 방지해주므로 반드시 붙이자.