티스토리 뷰

* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다.

36. Override 애노테이션은 일관되게 사용하라

@Override 애노테이션은 메서드 선언부에만 사용할 수 있고, 상위 자료형에 선언된 메서드를 재정의한다는 사실을 표현한다.

@Target(ElementType.METHOD) // 메서드에만 적용 가능
@Retention(RetentionPolicy.SOURCE) // 소스코드 까지만 적용 (.class 파일부턴 적용 X)
public @interface Override {
}

이 @Override 애노테이션을 일관되게 잘 사용하면 의외로 끔찍한 버그 발생을 방지할 수 있는 효과가 있다고 한다.

- 개발자의 실수로 의도치 않게 Overriding이 아니라 Overloading이 되는 경우를 막을 수 있다.

-> 컴파일러가 컴파일 시점에 오류를 잡아낼 수 있도록 만들어준다!


+) Overriding과 Overloading

Overriding (재정의)

- 상위 클래스 메서드를 재정의 하여 사용하는 것. 메서드 시그니처가 서로 동일.

 

Overloading (신규 생성)

- 상위 클래스 메서드와 이름은 같지만, 이외의 메서드 시그니처(리턴 타입, 파라미터)가 서로 달라 아예 새로운 메서드를 추가하는것.

- 말 그대로 같은 이름의 메서드를 추가로 loading 하는 것. 고놈 이름 참 잘지었다.


 

그냥 복잡한 말 필요 없이 상위 클래스에 선언된 메서드를 오버라이딩 할 때는 반드시 선언부에 @Override를 붙이자.

 

* 예외) 비-abstract 클래스에서 abstract 메서드를 오버라이딩 할 때는 굳이 애노테이션을 붙이지 않아도 된다.

- abstract 메서드를 재정의 하지 않으면 컴파일러가 어차피 오류를 내 주기 때문.

- 이 경우에도 상위 클래스를 재정의 한다는 사실을 드러내고 싶을 때는 @Override를 붙여도 아무 상관 없다.

 

* 인터페이스에 선언된 메서드를 구현할 때도 @Override를 사용할 수 있다.

- 역시 꼭 붙일 필요는 없다. 구현되지 않은 메서드가 있다면 어차피 컴파일러가 오류를 내기 때문.

- 하지만 마찬가지로 특정 인터페이스 메서드를 재정의한다는 의미를 드러내기 위해 붙여도 상관없다.

 

 

(결론)

상위 자료형에 선언된 메서드를 재정의(Overriding)하는 모든 메서드에는 @Override 애노테이션을 붙이도록 하자.

어차피 IDE가 다 만들어주는데 안 쓸 이유가 있을까?

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함