JAVA/Effective Java

[아이템 40] @Override 애너테이션을 일관되게 사용하라

꾸준함. 2024. 2. 28. 10:44

자바가 기본으로 제공하는 어노테이션 중 보통의 개발자에게 가장 중요한 것은 @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를 생략해 코드를 조금 깔끔히 유지하는 것도 좋음 

 

참고

이펙티브 자바

반응형