티스토리 뷰
* 이펙티브 자바 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가 다 만들어주는데 안 쓸 이유가 있을까?
'JAVA' 카테고리의 다른 글
메서드 설계는 신중하게 (0) | 2022.07.28 |
---|---|
메서드 앞에서 인자의 유효성을 검사하라 (0) | 2022.07.27 |
enum에서 ordinal 메서드를 사용하지 마라 (0) | 2022.07.27 |
상수 대신 Enum을 사용하라 (2) | 2022.07.27 |
배열보다 리스트를 사용해라 (0) | 2022.07.26 |