본문 바로가기

Dev Books/Effective Java32

[item 14] Comparable을 구현할지 고려하라. Comparable 인터페이스Comparable은 자바에서 객체 간의 자연 순서(natural ordering) 를 정의하기 위한 인터페이스이다. 이 인터페이스를 구현한 클래스는 compareTo(T o) 메서드를 반드시 오버라이드해야 하며, 이를 통해 두 객체의 순서를 비교할 수 있다.public interface Comparable { int compareTo(T o);}특징Object의 메서드가 아님compareTo는 Comparable 인터페이스의 메서드이므로, Object 클래스에는 존재하지 않는다.동치성 이상의 비교 가능equals()는 "같다 / 다르다"만 판단하지만, compareTo()는 "작다 / 같다 / 크다"까지 판단한다.제네릭 인터페이스타입 안정성을 제공하며, 잘못된 타입.. 2025. 7. 23.
[item 13] clone 재정의는 주의해서 진행하라. CloneableCloneable은 복제해도 되는 클래스임을 명시하는 용도의 Mixin interface이다. 이 인터페이스는 메서드를 하나도 정의하지 않으며, 단지 Object 클래스의 clone() 메서드의 동작 여부에 영향만 준다. Cloneable의 동작 방식Cloneable을 구현하지 않은 객체Object.clone()은 protected 메서드이며, Cloneable을 구현하지 않은 객체에서 호출하면 CloneNotSupportedException이 발생한다.Cloneable을 구현한 클래스반면, Cloneable을 구현한 클래스의 인스턴스에서 super.clone()을 호출하면,해당 객체의 필드를 단순 복사한 새 객체(얕은 복사)를 반환한다.정상적인 clone 동작을 위한 조건외부에서 c.. 2025. 7. 21.
[item 12] toString을 항상 재정의하라. Object의 기본 toString 메서드가 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없다. 이 메서드는 PhoneNumber@adbbd처럼 단순히 클래스_이름@진수로_표시한_해시코드를 반환할 뿐이다. 그래서 toString 메서드를 재정의해서 사용해야 한다. 1. toString() 규약간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 한다. (PhoneNumber@adbbd보다는 010-123-1234으로 알려주는게 좋다.)모든 하위 클래스에서 이 메서드를 재정의하라.toString을 잘 구현한 클래스는 사용하기에 휠씬 즐겁고, 그 클래스를 사용한 시스템은 디버깅하기 쉽다.toString 메서드는 객체를 println, printf, 문자열 연결 연산자(+), a.. 2025. 7. 18.
[item 11] equals를 재정의하려거든 hashCode도 재정의하라 equals를 재정의한 클래스 모두에서 hashcode도 재정의해야 한다.그렇지 않으면 hashcode 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으킬 것이다.1. Object 명세의 3가지 규약(1) 일관성 있는 hashCodeequals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashcode 메서든 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다. 단, 애플리케이션을 다시 실행한다면 이 값이 달라져도 상관없다. (2) equals가 true라면 hashCode도 동일해야 한다.equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같.. 2025. 7. 17.