[Effective Java] Chapter3 모든 객체의 공통 메서드

2022. 2. 8. 13:20· BOOK/[이펙티브 자바]
목차
  1. 1. equals는 일반 규약을 지켜 재정의하라
  2. 2. equals는 재정의하려거든 hashCode도 재정의하라
  3. 3. toString을 항상 재정의하라
  4. 4. clone 재정의는 주의해서 진행하라
  5. 5. Comparable을 구현할지 고려하라
  6. ※ 참고

Chapter3 모든 객체의 공통 메서드

 

1. equals는 일반 규약을 지켜 재정의하라

<일반 규약>

  • 반사성(reflexitivy) : null이 아닌 모든 참조값 x에 대해, x.equals(x)는 true이다.
  • 대칭성(symmetry) : null이 아닌 모든 참조값 x, y에 대해, x.equals(y)가 true이면 y.equals(x)도 true이다.
  • 추이성(transitivity) : null이 아닌 모든 참조값 x, y, z에 대해, x.equals(y)가 true이고, y.equals(z)가 true이면, x.equals(z)가 true이다.
  • 일관성(consistency) : null이 아닌 모든 참조값 x, y에 대해, x.equals(y)를 반복해서 호출하면 항상 true를 반환하거나 항상 false를 반환해야 한다.
  • null이 아닐 경우 : null이 아닌 모든 참조값 x에 대해, x.equals(null)은 false이다.

<정의 방법>

  1. == 연산자를 사용하여 입력이 자기 자신의 참조인지 확인(성능 최적화 용)
  2. instanceof 연산자로 입력이 올바른 타입인지 확인
  3. 입력을 올바른 타입으로 형변환
  4. 입력 객체와 자기 자신의 대응되는 '핵심' 필드들이 모두 일치하는지 확인



2. equals는 재정의하려거든 hashCode도 재정의하라

  • equals가 두 객체를 같다고 판단했으면, 두 객체가 같은 hashCode를 갖는 것이 원칙.
    • 따라서 equals를 재정의를 했는데 hashCode를 재정의를 안하면 다음과 같은 오류가 발생
    • Map<PhoneNumber, Name> m = new HashMap<>();
      m.put(new PhoneNumber(010, 1234, 5678), "제니"); //phoneNumber(key): 010-1234-5678, name(value): 제니 저장
      
      m.get(new PhoneNumber(010, 12345, 5678)); // null을 반환 함.
      • 주로 Hash-인 컬렉션에서 이러한 문제가 발생할 수 있음



3. toString을 항상 재정의하라

  • 실전에서 상위 클래스에서 toString을 제외한 경우를 제외하고, toString을 재정의 하는 것이 좋다.
    • toString으로 객체의 주요 정보를 모두 반환하는것이 좋지만, 객체가 너무 거대하거나 표현하기 어렵다면, 요약한 내용을 반환하는 것도 좋다.



4. clone 재정의는 주의해서 진행하라

  • Cloneable을 구현한 객체는 clone()을 통해 해당 객체를 복사 할 수 있음
  • 새로운 인터페이스를 만들 때는 Clonealbe을 확장해서는 안됨
    • final과 Array는 가능 (단, final 클래스면 성능을 테스트 해봐야 함)



5. Comparable을 구현할지 고려하라

  • 순서를 고려해야 하는 값 클래스를 작성할 때는 Comparable 인터페이스를 구현하여야 함
  • x.compareTo(y)메서드는 x가 y보다 작으면 음의 정수를 같으면 0, 크면 양의 전수를 반환
    • 구현할 때 >, <를 사용하면 안됨
    • 정적 compare메서드나 comparator 인터페이스가 제공하는 비교자 생성 메서드를 사용




※ 참고

  • 이펙티브 자바 - 조슈아 블로크
저작자표시 (새창열림)

'BOOK > [이펙티브 자바]' 카테고리의 다른 글

[Effective Java] Chapter7 람다와 스트림  (0) 2022.03.17
[Effective Java] Chapter6 열거 타입과 애너테이션  (0) 2022.03.15
[Effective Java] Chapter5 제네릭  (0) 2022.02.15
[Effective Java] Chapter4 클래스와 인터페이스  (0) 2022.02.10
[Effective Java] Chapter2 객체 생성과 파괴  (0) 2022.02.03
  1. 1. equals는 일반 규약을 지켜 재정의하라
  2. 2. equals는 재정의하려거든 hashCode도 재정의하라
  3. 3. toString을 항상 재정의하라
  4. 4. clone 재정의는 주의해서 진행하라
  5. 5. Comparable을 구현할지 고려하라
  6. ※ 참고
'BOOK/[이펙티브 자바]' 카테고리의 다른 글
  • [Effective Java] Chapter6 열거 타입과 애너테이션
  • [Effective Java] Chapter5 제네릭
  • [Effective Java] Chapter4 클래스와 인터페이스
  • [Effective Java] Chapter2 객체 생성과 파괴
쿠엔크
쿠엔크
우아한테크코스 5기 BE 에단 Github : https://github.com/cookienc
쿠엔크
기러기는 기록기록
쿠엔크
전체
오늘
어제
  • 분류 전체보기 (132)
    • CS (46)
      • [OS] (12)
      • [NETWORK] (10)
      • [DATABASE] (11)
      • [BASIC CONCEPT] (1)
      • [DATA STRUCTURE] (7)
      • [ALGORITHM] (5)
    • LANGUAGE (17)
      • [JAVA] (17)
    • DESIGN_PATTERN (2)
    • FRAMEWORK (18)
      • [SPRING] (18)
    • ORM (11)
      • JPA (11)
    • AWS (7)
    • BOOK (10)
      • [자바 웹 개발 워크북] (3)
      • [이펙티브 자바] (7)
    • 개발 (19)
      • [오류] (7)
      • [고민] (1)
      • [우테코] (10)
      • [iTracker] (1)
    • Tip (1)
      • [Plugins] (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 오류
  • 스프링
  • CORS
  • 자바 웹 개발 워크북
  • 알고리즘
  • 자료구조
  • aws
  • 가비아
  • 개념
  • JVM
  • 운영체제
  • JPA
  • ArgumentResolver
  • HTTP
  • 네트워크
  • 데이터베이스
  • Effective Java
  • java
  • 디자인 패턴
  • Spring

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
쿠엔크
[Effective Java] Chapter3 모든 객체의 공통 메서드

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.