DevBook/Effective Java
-
아이템14. Comparable을 구현할지 고려하라DevBook/Effective Java 2023. 5. 7. 22:52
📍상황 public interface Comparable { int compareTo(T t); } Comparable 인터페이스는 compareTo() 메서드를 제공함 Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 자연적인 순서가 있음을 뜻함 --> 해당 순서대로 정렬이 가능함 알파벳, 숫자, 연대 같이 순서가 명확한 값 클래스를 작성한다면 반드시 Comparable 인터페이스를 구현하자 *compareTo 메서드의 일반 규약 equals 규약과 똑같이 반사성, 대칭성, 추이성을 충족해야 함 따라서 기존 클래스를 확장한 구체 클래스에서 새로운 값 컴포넌트를 추가했다면 compareTo 규약을 지킬 방법이 없음 우회법도 equals와 동일하게 확장하는 대신 독립된 클래스를 만들고, 이 ..
-
아이템13. clone 재정의는 주의해서 진행하라DevBook/Effective Java 2023. 5. 7. 21:02
📍상황 Cloneable은 복제해도 되는 클래스임을 명시하는 용도인 mixin 인터페이스지만, 아쉽게도 의도한 목적을 제대로 이루지 못했음 clone 메서드가 선언된 곳이 Cloneable이 아닌 Object이고, protected로 선언됨 --> Cloneable을 구현하는 것만으로는 외부 객체에서 clone 메서드를 호출할 수 없음 리플렉션을 사용하면 가능하지만, 100% 성공하는 것은 아님 --> 해당 객체가 접근이 허용된 clone 메서드를 제공한다는 보장이 없기 때문임 하지만 Cloneable 방식은 널리 쓰이고 있어 잘 알아두는 것이 좋음 이번 아이템에서 다룰 내용 clone 메서드를 잘 동작하게끔 해주는 구현 방법 언제 재정의해서 사용해야 하는지, 가능한 다른 선택지는 무엇인지 📍방법 Clo..
-
아이템12. toString을 항상 재정의하라DevBook/Effective Java 2023. 5. 7. 16:28
📍상황 Object의 기본 toString 메서드가 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없음 단순히 클래스_이름@16진수로_표시한_해시코드 를 반환함 toString의 일반 규약 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환해야 함 모든 하위 클래스에서 이 메서드를 재정의해야 함 장점 - toString을 잘 구현한 클래스는 디버깅하기 쉬움 toString 메서드는 객체를 println, printf, assert 구문에 넘길 때, 혹은 디버거가 객체를 출력할 때 자동으로 호출됨 즉, 직접 호출하지 않더라도 다른 어딘가에서 쓰일 것임 toString을 제대로 재정의하지 않는다면 쓸모없는 메시지만 로그에 남을 것임 📍방법 1. toString은 그 객체가 가진 주요 정..
-
아이템11. equals를 재정의하려거든 hashCode도 재정의하라DevBook/Effective Java 2023. 5. 7. 12:57
📍상황 equals를 재정의한 클래스 모두에서 hashCode도 재정의해야 함 이유 hashCode 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제가 됨 규약 문제가 되는 부분 hashCode를 잘못 재정의했을 때 문제가 되는 조항은 두 번째임 hashCode를 재정의하지 않으면 논리적 동치인 두 객체가 서로 다른 해시코드를 반환하여 두 번째 규약을 지키지 못함 --> 즉, 논리적으로 같은 객체는 같은 해시코드를 반환해야 함 예시 Map map = new HashMap(); map.put(new PhoneNumber(010, 1234, 5678), "java"); //PhoneNumber 클래스의 equals를 재정의했는데 hashC..