Reference/Effective-Java

    [Effective-Java] Chapter3 #14. Comparable을 구현할지 고려하라

    📌 Why use Comparable.compareTo()? 두 가지 성격을 제외하면 Object의 equals와 동일하다. 그렇다면 언제 Comparable.compareTo를 구현하는가? compareTo 메서드는 단순 동치성 비교에 더해 자연적인 순서(natural order) 비교까지 가능하며 제네릭하다. Comparable을 구현한 객체들의 배열은 Arrays.sort()로 손쉽게 정렬이 가능해진다. (검색, 극단값 계산, 자동 정령되는 컬렉션 관리까지도 쉽게 가능하다.) 예를 들어, Comparable을 구현한 String 객체는 아래 스니펫으로 알파벳 순으로 출력이 가능하다. public class WordList { public static void main(String[] args) { ..

    [Effective-Java] Chapter3 #13. clone 재정의는 주의해서 진행하라

    기본 원칙은 "복제 기능은 (배열을 제외하고) 생성자와 팩터리를 이용하는 게 최고"이다. 📌 Cloneable ✒️ clone() 단어가 주는 의미 그대로 자신을 복제하여 새로운 인스턴스를 생성해준다. clone() 메서드를 오버라이딩 하기 위해서는 Cloneable을 우선 구현해주어야 한다. 구현할 때는 얕은 복사가 되지 않도록 주의하여야 한다. public interface Cloneable { } 메서드 하나 없는 Cloneable 인터페이스는 Object의 protected 메서드인 clone의 동작방식을 결정한다. (보통 인터페이스라 하면 클래스가 해당 인터페이스에서 정의한 기능을 제공한다고 선언하는 행윈데, Cloneable은 상당히 이례적인 케이스니 따라하지 말자.) Cloneable을 구현..

    [Effective-Java] Chapter3 #12. toString을 항상 재정의하라

    이 아이템은 개발을 해본 사람이라면 너무나도 당연한 이야기이다. Object의 기본 toString 메서드는 PhoneNumber@adbbd처럼 단순히 클래스_이름@16진수_해시코드를 반환할 뿐이다. toString의 일반 규약에 따라 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환하라. 또한 "모든 하위 클래스에서 이 메서드를 재정의하라" toString을 잘 구현하는 것만으로도 디버깅에 굉장히 유용하다. 이는 심지어 직접 사용하는 경우를 제외하더라도 assert에 의한 자동 호출이나, println, 문자열 연결 연산자 등에서도 사용된다. (다른 어딘가에서는 쓰일 것이란 이야기이다.) 반면, toString을 재정의해주지 않는다면 로그에는 쓸 데 없는 정보만 알려주고 있을 것이고, 해당 인..

    [Effective-Java] Chapter3 #11. equals를 재정의하려거든 hashCode도 재정의하라

    HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제가 발생할 수 있다. ✒️ hashCode hashCode는 알고리즘에 의해 생성된 정수 값이다. 객체 내용을 기반으로 생성하기도 하지만, 할당된 메모리 주소를 기반으로 생성되는 정수값일 수도 있다. 즉, 완전히 동일한 내용의 객체라 할 지라도 다른 hashCode 값을 반환한다는 보장을 할 수 없다. 📌 Object 명세에서 말하는 hashCode 규약 equals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode도 변하면 안 된다. (단, 애플리케이션을 다시 실행한다면 값이 달라져도 상관 없다.) equals가 두 객체를 같다고 판단했으면, 두 객체의 hashCode는 같은 값을 반환해..