Item 16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
퇴보한 클래스 예시 class Point { public double x; public double y; } 해당 클래스는 데이터 필드에 직접 접근할 수 있기에 캡슐화 이점을 제공하지 못한다. 필드를 변경하려면 API를 변경해야한다. 불변식을 보장할 수 없고, 스레드 안전하지 않다 외부에서...
퇴보한 클래스 예시 class Point { public double x; public double y; } 해당 클래스는 데이터 필드에 직접 접근할 수 있기에 캡슐화 이점을 제공하지 못한다. 필드를 변경하려면 API를 변경해야한다. 불변식을 보장할 수 없고, 스레드 안전하지 않다 외부에서...
구현과 API를 분리하는 “정보 은닉”의 장점 시스템 개발 속도를 높인다. (여러 컴포넌트를 병렬로 개발할 수 있기 때문에) 시스템 관리 비용을 낮춘다. (컴퍼넌트를 더 빨리 파악할 수 있기 때문에) 성능 최적화에 도움을 준다. (최적화할 컴포넌트를 정한 후, 다른 컴포넌트에 영향끼치지 않고 해당 컴포넌트만 개선 가능하기 때문에) 소프...
compareTo 규약 Object.equals()와 다르게 단순 동치성 비교 뿐만 아니라 순서 비교도 가능하며 제네릭하다. 자기 자신이 (this)이 compareTo에 전달된 객체보다 작으면 음수, 같으면 0, 크다면 양수를 리턴한다. 반사성(A>B = B<A), 추이성(A<B, B<C 이면 A<C), 일관성...
clone 메서드가 선언된 곳이 Cloneable이 아닌 Object이며, 접근 제한자가 protected이기 때문에 Cloneable을 구현하는 것만으로는 외부 객체에서 clone 메서드를 호출할 수 없다. 이런 문제점에도 불구하고, Cloneable 방식은 널리 쓰인다. 이에 대해 알아보자. Cloneable 인터페이스 Object...
toString을 항상 재정의하라 /** * Returns a string representation of this collection. The string * representation consists of a list of the collection's elements in the * order they are returned by its ...
equals를 재정의한 클래스 모두에서 hashCode도 재정의해야한다. 그렇지 않으면 HashMap이나 HashSet 같은 컬렉션 원소로 사용할 때 문제가 발생한다. Object hashCode 명세 규약 equals 비교에 사용하는 정보가 변경되지 않았다면 hashCode는 매번 같은 값을 리턴해야 한다. (변경되거나, 애플리케이션을 다...
equals 메서드는 재정의하기 쉬워보이지만 곳곳에 함정이 도사리고 있다. 따라서 재정의가 필요하지 않은 경우에는 재정의하지 않는 것이 최선의 선택이다. equals 재정의를 추천하지 않는 상황 🙅 각 인스턴스가 본질적으로 고유한 경우 값을 표현하는게 아니라 동작하는 개체를 표현하는 클래스 일 때 ex) Thread 클래...
객체의 재사용 똑같은 기능의 객체를 매번 생성하는 것보다 객체 하나를 재사용하는 편이 나을 때가 많다. 생성자 대신 정적 팩터리 메서드를 사용하여 불필요한 객체 생성을 피할 수 있다. ex) Boolean(String) 대신 Boolean.valueOf(String) 생성 비용이 아주 비싼 객체일 경우 String.matche...
클래스가 하나 이상의 자원에 의존할 때 - 맞춤법 검사기 예시 정적 유틸리티 클래스로 구현하는 경우 // 정적 유틸리티를 잘못 사용한 예 - 유연하지 않고 테스트하기 어렵다. public class SpellChecker { private static final Lexicon dictionary = ...; // 사전에 의존 pr...
정적 멤버만 담은 유틸리티 클래스 정적 메서드와 정적 필드만을 담은 클래스 java.lang.Math, java.util.Arrays, java.util.Collections final 클래스와 관련한 메서드를 모아놓을 때도 사용한다. 유틸성 클래스 예시 java.lang.Math public final class Math { ...