반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 프로그래머스 가위바위보
- 비지니스 레이어
- 리트허브 커밋
- 프로그래머스 가위바위보 풀이
- 주니어개발자
- 2-layered architecture
- leftJoin
- 배열의 유사도 파이썬
- 프레젠테이션 레이어
- collection python
- 프로그래머스
- 가위바위보 풀이
- 알고리즘
- 스프링 시스템 구조
- 개발자 취준
- 프로그래머스 배열 회전시키기
- BigO notation
- 공선옥
- 리트허브 사용법
- 프로그래머스 특정 문자 제거하기
- programmers 배열 회전
- 슈츠 자막
- 파이썬 특정 문자 제거하기
- 춥고 더운 우리 집
- 프로그래머스 배열의 유사도 파이썬
- 춥고더운우리집
- Programmers 배열의 유사도
- 특정문자 제거하기
- 파이썬 컬렉션
- 리트허브 오류
Archives
- Today
- Total
기억보다 기록을
[Effective JAVA] 이펙티브 자바 item10.equals는 일반 규약을 지켜 재정의하라 본문
반응형
이펙티브 자바 스터디에서 아이템 10-12 파트를 발표하게 되었다. 해당 부분을 두번 읽었는데, 처음 읽을 때는 무슨소리지? 싶던 내용이 두번째 읽을 땐 '아, 이말이었구나.' 싶은 순간이 생기더라. 물론, 다른이에게 설명할 정도로는 부족하여 이 포스팅을 쓰며 차근차근 정리 후 내 것으로 만드는 시간이 필요하다 (이 책은 어색한 번역체와 불친절하게 느껴지는 예시들이 개선되면 더 좋은 평을 얻을 것 같다ㅎ) 해당 포스팅의 내용은 이펙티브 자바 책과 백기선 개발자의 강의, 그리고 구글링을 통해 구성되었다. 일부 사견을 포함한다.
아이템 10은 '3장 모든 객체의 공통 메서드'의 첫 아이템이다. Object 클래스에서 final이 아닌 메서드 equals, hashcode, toString은 모두 재정의(overriding)를 염두에 두고 설계되었다. 이 오브젝트 메서드들을 언제, 어떻게 재정의 해야하는가?
[Item 10] equals는 일반 규약을 지켜 재정의하라
- 자바에서 모든 클래스는 암묵적으로 object 클래스를 상속한다.
- 3장은 final이 아닌 메소드 "equals, hashcode, toString, clone, finalize"를 오버라이딩할 때 지켜야할 점에 대해 이야기한다.
- 그 중 equals는, "만들지 않아도 되면 굳이 만들지 않는 것이 좋다."
- 특히 아래 4가지 경우는 더욱 그렇다.
1) 각 인스턴스가 본질적으로 고유한 경우 (Singleton, Enum, Thread)
2) 인스턴스의 논리적 동치성 ('logical equality')를 검사할 일이 없는 경우 (String "Hello")
3) 상위 클래스에서 재정의한 equals가 하위 클래스에도 들어맞는 경우 (list, set: 부모클래스인 abstract list, abstract map에 잘 정의되어 있음)
4) 클래스가 private or package-private이고 equals 메서드를 호출할 일이 없는 경우 (밖에서 마음대로 참조할 수 없는 클래스인 경우 굳이 equals를 사용하지 않는다. 접근제한자가 public인 경우 누구나 참조해서 쓸 수 있기 때문에 어떻게 쓰일지 예측할 수 없다.)
equals 재정의 규약
1) 반사성 (A.equals(A) == true)
2) 대칭성 (A.equals(B) == B.equals(A))
3) 추이성 (A.equals(B) && B.equals(C), A.equals(C))
4) 일관성 (A.equals(B) == A.equals(B))
5) null이 아님 (A.equals(null) == false)
```
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
} //반사성
if (!(o instanceof Point)){
return false;
} //instanceof로 타입비교
Point p = (point)o; //타입 형변환
return p.x == x && p.y == y; //핵심필드 같은지 비교
//double,float.compare(), nullable인 경우: objects.equals()
}
```
AutoValue 사용법
```
<dependency>
<groupId>com.google.auto.value</groupId>
<artifactId>auto-value-annotations</artifactId>
<version>1.9</version>
</dependency>
```
```
@AutoValue
abstract class Point {
static Point create(int x, int y) {
return new AutoValue_Point(x, y);
}
abstract int x();
abstract int y();
}
```
lombok? @EqualsAndHashCode
반응형
'Language > JAVA' 카테고리의 다른 글
[Effective JAVA] 이펙티브 자바 item12.toString을 항상 재정의하라 (0) | 2023.01.15 |
---|---|
[Effective JAVA] 이펙티브 자바 item11.equals를 재정의하려거든 hashCode도 재정의하라 (0) | 2023.01.15 |
[JAVA] 자료구조_클래스, 객체, 참조변수 (1) (0) | 2022.07.02 |
[JAVA] 메소드 호출과 프로그램의 기능적 분할-call by reference, call by value, actual prameter, formal parameter (0) | 2022.06.06 |
[JAVA] n개의 연속된 숫자 나열을 정수로 환산하여 소수인지 판별 후 최대값 구하는 프로그램 (0) | 2022.03.05 |