Java/객체지향

[객체지향][애너테이션/Annotation] - 애너테이션(Annotation)

얄루몬 2022. 2. 24. 18:28

https://youtu.be/i4V8ZI9Undc?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.


[애너테이션이란?]

  • 주석처럼 프로그래밍 언어에 영향을 미치지 않으며, 유용한 정보를 제공하는 것을 의미한다.
  • 특정 프로그램(정보제공, 설정정보)을 위한 것으로 특정 프로그램이 아니라면 영향이 아예 없다.\
  • 설정 정보를 XML로 공유할 때 많은 사람들이 수정하기가 번거롭기 때문에 본인이 필요한 설정 정보만 애너테이션으로 설정해서 사용하는 것이 바람직하다.

 

 

[애너테이션의 사용 예시]

@Test //애너테이션
public void method() {

}
  • @Test 애너테이션은 이 메서드가 단위 테스트 대상임을 테스트 프로그램인(JUnit)에게 알리는 용도다.

 

 

[자바 제공 애너테이션]

  • 이는 자바에서 제공하는 애너테이션들이다.

 

 

[자바 표준 애너테이션]

[@Override]

  • 오버라이딩을 올바르게 했는지 컴파일러가 체크하게 한다.
  • 오버라이딩할 때 메서드 이름을 잘못 적는 실수를 하는 경우가 많기 때문에 이를 위해 체크하게 해준다.
  • 오버라이딩할 때는 메서드 선언부 앞에 @Override를 붙이자

 

[@Deprecated]

  • 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙인다.
  • 자바는 하위호환성을 중요하게 여기기 때문에 사용하지 않는 메소드를 삭제하지 않고 이런 애너테이션으로 사용하지 않을 것을 표시해주며 사용한다.
  • @Deprecated가 붙은 대상이 사용된 코드를 컴파일하면 나타나는 메시지가 있다.
@Deprecated
public int getDate() {
	return normalize().getDayOfMonth();
}

 

[@FunctionalInterface]

  • 함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지를 체크해준다.
  • 함수형 인터페이스에는 하나의 추상메서드만 가져야 한다는 제약이 있다.
    • 본래 인터페이스는 여러 추상메서드를 가질 수 있다. 그러나 함수형 인터페이스의 경우엔 추상메서드를 하나만 가져야 한다.

  • 위의 경우엔 추상메서드를 2개 이상 가지고 있기 떄문에 문제가 생긴다.
    • 이를 컴파일러가 체크하게 해준다.

 

[@SuppressWarnings]

  • 컴파일러의 경고메시지가 나오지 않게 억제한다.
  • 괄호( ) 안에 억제하고자 하는 경고의 종류를 문자열로 지정한다.
@SuppressWarnings("unchecked") //제네릭스 관련 경고 억제해주는 것
ArrayList list = new ArrayList(); //제네릭 타입 지정하지 않았음
list.add(obj); // 경고 발생해야 하지만 @SuppressWarnings으로 경고 억제시킴
  • 경고가 날 것이라는 걸 이미 본인이 알고 있는 상황이라면 이 어노테이션을 사용해도 된다.

 

 

[실습]

[컴파일러가 Override 관련 오류를 잡아주게 해주는 @Override 애너테이션]

package javajungsuk;

class Parent {
	void parentMethod() {}
}

class Child extends Parent{
	@Override
	void parentmethod() {} // 조상 메서드의 이름을 잘못적음
}
  • 본래는 컴파일러가 이 문제를 체크해주지 않는다. 
  • 그러나 @Override를 사용해 이 문제를 먼저 체크해주고 오류를 잡아준다
package javajungsuk;

class Parent {
	void parentMethod() {}
}

class Child extends Parent{
	@Override
	void parentMethod() {} // 조상 메서드의 이름을 잘못적음
}

 

[@Deprecated를 사용한 예제 코드]

 

package javajungsuk;

class Parent {
	void parentMethod() {}
}

class Child extends Parent{
	@Override
	@Deprecated
	void parentMethod() {} // 조상 메서드의 이름을 잘못적음
}

class Java12_7{
	public static void main(String[] args) {
		Child c = new Child();
		c.parentMethod();//
	}
}