베어_
TechBear
베어_
전체 방문자
오늘
어제
  • 분류 전체보기 (336)
    • Spring (33)
      • 개념 (13)
      • Security (5)
      • 실습 (1)
      • 토비 스프링 (11)
    • JPA (6)
    • 프로젝트 기록 (24)
    • DB (13)
    • JAVA (18)
    • 알고리즘 (50)
      • 유형정리 (8)
      • Baekjoon (21)
      • LeetCode (18)
    • 디자인패턴 (0)
    • 개발서적 (79)
      • Effective Java (78)
      • 객체지향의 사실과 오해 (1)
    • 독후감 (4)
    • 보안 (2)
    • 운영체제(OS) (53)
      • 공룡책 (53)
    • 컴퓨터 네트워크 (28)
      • 컴퓨터 네트워크 하향식 접근 (23)
    • 자료구조 (1)
    • DevOps (2)
    • 앱 개발 (20)
      • 안드로이드 스튜디오 (20)

블로그 메뉴

    공지사항

    인기 글

    태그

    • 백준
    • 스프링
    • 함수형인터페이스
    • 자바8
    • jpa
    • dfs
    • 코드업
    • 자바
    • 데이터베이스
    • java
    • 스프링시큐리티
    • 이펙티브자바
    • 토비스프링
    • 스레드
    • 운영체제
    • leetcode
    • BFS
    • C++
    • 알고리즘
    • Spring

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    베어_

    TechBear

    개발서적/Effective Java

    [Effective Java] @Override 애너테이션을 일관되게 사용하라

    2023. 5. 31. 06:58

    @Override를 사용하지 않았을 때 버그의 발생

    import java.util.HashSet;
    
    public class Bigram {
    
        private final char first;
        private final char second;
    
        public boolean equals(Biagram b) {
            ...
        }
    
        public int hashCode() {
            return ...;
        }
    
        public static void main(String[] args) {
            Set<Biagram> s = new HashSet<>();
            for(int i = 0; i < 10; i++) {
                for(char ch = 'a'; ch <= 'z'; ch++) {
                    s.add(new Biagram(ch, ch));
                }
            }
        }
    }

    다음은 a ~ z 알파벳을 10번씩 Set에 집어넣는 코드이다. Set은 중복이 허용되지 않기 때문에 Set에는 10개의 요소만 들어가야 하지만 그렇지 않다. equals와 hashCode를 재정의했고 사용하는 것에도 문제가 없어보인다.

    하지만 equals를 재정의 한게 아니라 사실은 오버로딩한게 되어 버렸다. Object의 equals를 재정의하려면 매개변수가 Object이여야 하는데 Biagram을 매개변수로 받았기 때문이다.

    이런 오류는 @Override 어노테이션을 달면 컴파일러가 쉽게 에러를 찾을 수 있다. 상위 클래스의 메서드를 재정의하려는 모든 메서드에는 @Override 애너테이션을 달아야 한다.

    저작자표시 비영리 변경금지 (새창열림)
      '개발서적/Effective Java' 카테고리의 다른 글
      • [Effective Java] 익명 클래스보다는 람다를 사용하라
      • [Effective Java] 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라
      • [Effective Java] 명명 패턴보다 애너테이션을 사용하라
      • [Effective Java] 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라
      베어_
      베어_
      Today I learned | 문제를 해결하는 개발자

      티스토리툴바