자바가 기본으로 제공하는 어노테이션 중 보통의 개발자에게 가장 중요한 것은 @Override 어노테이션입니다.
@Override는 메서드 선언에만 달 수 있으며, 해당 어노테이션이 달렸다는 것은 상위 타입의 메서드를 재정의했음을 뜻합니다.
- 오버라이딩과 오버로딩 차이는 꼭 숙지 필요
- 상위 타입과 동일한 메서드 시그니처가 같으면 오버라이딩, 시그니처가 다르면 오버로딩
@Override를 선언하지 않은 메서드
코드 부연 설명
- 똑같은 소문자 2개로 구성된 바이그램 26개를 10번 반복해 Set에 추가한 후 해당 Set의 크기를 출력하는 프로그램
- Set은 중복을 허용하지 않기 때문에 26이 출력될 것으로 예상하지만 실제 값은 260
- HashSet은 내부적으로 equals 메서드를 기반으로 객체의 논리적 동치성 검사를 실시
- 최상위 계층인 Object의 equals() 매개변수 타입은 Object인 반면 위 코드에서는 매개변수 타입을 Bigram으로 정의했기 때문에 오버라이딩이 아니라 오버로딩
- 즉, equals를 재정의하지 않았기 때문에 Object의 equals를 통해 요소들을 비교헀고 Object의 equals는 == 연산자와 똑같이 객체 식별성만을 확인하기 때문에 같은 소문자를 소유한 바이그램 10개 각각이 서로 다른 객체로 인식되어 260을 출력
실제로 @Override를 오버로딩한 메서드에 달면 컴파일 시점에 아래와 같은 에러가 발생하는 것을 확인할 수 있습니다.
컴파일 에러 메시지를 기반으로 잘 못된 코드를 수정하면 예상한대로 26이 출력되는 것을 확인할 수 있습니다.
@Override 어노테이션을 달아야하는 케이스
- 상위 클래스의 메서드를 재정의하려는 모든 메서드에 @Override 어노테이션 다는 것을 권장
- 구체 클래스인데 아직 구현하지 않은 추상 메서드가 남아 있을 경우 컴파일러가 해당 사실을 알려주기 때문에 구체 클래스에서 상위 클래스의 추상 메서드를 재정의할 때는 굳이 @Override를 달지 않아도 되지만 재정의 메서드 모두에 @Override를 일괄로 붙이는 습관을 들이는 것을 권장
- 컴파일 시점에 실수를 인지할 수 있도록 추상 클래스나 인터페이스에서는 상위 클래스나 상위 인터페이스를 재정의하는 모든 메서드에 @Override 어노테이션을 추가하는 것이 권장
- 자바 8버전부터 default 메서드의 사용이 가능해지면서 인터페이스의 메서드를 재정의할 때도 @Override 사용
- 구현하려는 인터페이스 내 default 메서드가 없음을 안다면 @Override를 생략해 코드를 조금 깔끔히 유지하는 것도 좋음
참고
이펙티브 자바
반응형
'JAVA > Effective Java' 카테고리의 다른 글
[아이템 42] 익명 클래스보다는 람다를 사용하라 (1) | 2024.03.02 |
---|---|
[아이템 41] 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 (0) | 2024.02.29 |
[아이템 39] 명명 패턴보다 애너테이션을 사용하라 (0) | 2024.02.28 |
[아이템 38] 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 (0) | 2024.02.27 |
[아이템 37] ordinal 인덱싱 대신 EnumMap 사용하라 (0) | 2024.02.27 |