티스토리 뷰

JAVA

모든 객체의 공통 메서드

김남김 2023. 12. 2. 00:47


Objcet는 자바의 모든 클래스의 조상 클래스로, 객체를 만들 수 있는 구체 클래스지만 기본적으로 상속해서 사용하도록 설계되어있다.
Object의 재정의를 염두에 두고 설계된 메서드 equals, hashCode, toString, clone, finalize를 잘못 구현하면 오작동할 수도 있기에
어떻게 재정의해야하고 왜 재정의해야하는지에 대해서 학습한다. 


10. equasl는 일반 규약을 지켜 재정의하라. 


equals는 재정의하기 쉬워보이지만 자칫하면 원치않은 결과를 초래할 수 있다. 
이러한 원치않은 결과를 바라지않는다면 웬만큼 재정의하지말자.
만약 해야하는 경우가 있다면 아래 규약을 지키도록한다.
반사성 null이 아닌 모든 참조값에 대해 x.equals(x)는 true다.
대치성 x.equals(y)와 true 라면  y.equals(x)도 true다. 
추이성 x.equals(y)와 y.equals(z)가 true 라면 x.equals(z)로 true다. 
일관성 x.equlas(y)가 true 라면 반복하더라도 같은 값을 가져야한다. 
null 아님  null이 아닌 모든 참조값 x에 대해 x.equals(null)은 false다 .


11. equals를 재정의하려거든 hashCode도 정의하라.


equals를 재정의한 클래스에서 모두 hashCode도 재정의해야한다.
왜냐하면 똑같은 객체를 비교하는 컬렉션(HashMap, HashSet)의 경우에 원치않은 결과를 가질 수 있기 때문이다. 
만약 재정의하게 된다면 AutoValue 프레임워크를 사용하여 equals와 HashCode를 자동으로 만들어주도록하자.


12. toString을 항상 재정의하라. 


toString을 재정의함으로써 갖는 이득이 많다.
디버깅에서 해당 객체를 전달함으로써 어떤 곳에서 에러가 났는지 확인하기 쉽고 정확한 값을 전달했는가 구분하기도 좋다. 


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


Clone 메서드는 사실상 생성자와 같은 효과를 가진다.
Clonealbe 아키텍쳐는 가변 객체를 참조하는 필드는 final과 충동하게된다. 그렇기에 추천하지 않는다.
만약 clone 메서드를 재정의해야한다면 복사 생성자와 복사 팩터리 방식을 사용해서 재정의하도록 한다. 


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


순서를 고려해야하는 값 클래스를 작성한다면 
꼭 Comaptable 인터페이스를 구현하여 그 인스턴스를 쉽게 정렬, 검색, 비교하는 기능을 제공하는 컬렉션과 어우러지도록 한다. 
더불어 Comaptable 인터페이스 단 하나뿐인 메서드 compareTo를 정의할 때는 >와 < 연산자보다는 박싱된 기본 타입 클래스가 제공하는 정적 compare메서드나  Comparator 인터페이스가 제공하는 비교자 생성 매서드를 사용하라. 

'JAVA' 카테고리의 다른 글

객체의 생성과 파괴  (2) 2023.12.02
자바 습관(올바른 문자열 처리)  (0) 2023.11.29
자바 습관 (기본 프로그래밍)  (0) 2023.11.28
어떻게 협력하는가? (with MVC)  (0) 2023.10.14
Java 코딩 컨벤션  (1) 2023.10.13
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
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
글 보관함