본문 바로가기

이펙티브 자바10

[아이템 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 보통 클래스는 하나 이상의 자원에 의존합니다. 예를들어 맞춤법 검사기는 사전(dictionary)에 의존하는데 이런 클래스를 정적 유틸리티 클래스 또는 싱글턴으로 구현하는 경우가 종종 있습니다. 두 방식 모두 사전을 단 한개만 사용한다고 가정한다는 점에서 재사용성이 떨어진다고 볼 수 있습니다. package item5_20210422; import java.util.ArrayList; import java.util.List; // 맞춤법 검사기 클래스는 사전(dictionary)에 의존 // 아래는 각각 // 유틸리티로 구현한 맞춤법 검사기 class SpellCheckTypeUtilClass { private static final Lexicon dictionary = new KoreanDictiona.. 2021. 4. 22.
[아이템 4] 인스턴스화를 막으려거든 private 생성자를 사용하라 이따금 단순히 static 메서드와 static 필드만을 담은 클래스를 만들고 싶을 때가 있습니다. (객체 지향적이지 못해서 남용하면 좋지않지만.. 나름의 쓰임새가 있다!) java.lang.Math 와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓을 수 있습니다. java.util.Collections 처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드 혹은 정적 팩터리 메서드를 모아놓을 수 있습니다. (자바 8부터 이런 메서드를 인터페이스에 모아둘 수 있습니다.) final 클래스와 관련한 메서드들을 모아놓을 때도 사용합니다. -> final 클래스를 상속해서 하위 클래스에 메서드를 넣는 건 불가능하기 때문입니다. 정리하면 static 메서드와 static.. 2021. 4. 20.
[아이템 3] private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴(singleton) 싱글턴이란? 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말합니다. 싱글턴의 전형적인 예로 함수(아이템24)와 같은 무상태 객체(stateless object)나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있습니다. 그런데 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트 하기가 어려워 질 수 있습니다. -> 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문입니다. (하나의 인스턴스만 존재하기 때문) 만약 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이라면 싱글턴 인스턴스를 가짜 구현으로 대체할 수 있습니다. 싱글턴을 만드는 방법 싱글턴을 만드는 방법은 보통 두 가지가 있습니다. 두 방법 모두 생성자는 private로 외부.. 2021. 4. 20.
[아이템 2] 생성자에 매개변수가 많다면 빌더를 고려하라 아이템 1 의 정적 팩터리 메서드와 생성자에는 똑같은 제약이 하나 있습니다. 선택적 매개변수가 많을 때는 적절히 대응하기 어렵다는 점입니다. 만약 식품의 영양 정보를 저장하는 클래스는 다음과 같은 인자가 필요할것입니다., 1회 내용량 총 n회 제공량 1회 제공량당 칼로리 열량 탄수화물 단백질 지방 트랜스지방 포화지방 콜레스테롤 나트륨 등등 많은 선택 항목이 생기는데 대부분 제품은 이 선택 항목이 그냥 0인 경우가 많습니다. 식품의 영양 정보 클래스의 생성자 혹은 정적 팩터리 메서드는 어떤 모습일까요? 이런 상황에 점층적 생성자 패턴 (telescoping constructor pattern)을 즐겨 사용했습니다. 점층적 생성자 패턴(Telescoping Constructor Pattern) 점층적 생성자.. 2021. 4. 18.
[아이템 1] 생성자 대신 정적 팩터리 메서드를 고려하라 클라이언트(API를 호출하는 곳)가 클래스의 인스턴스를 얻는 정통적인 수단은 public 생성자입니다. 하지만 모든 프로그래머가 알아야 하는 기법이 하나 더 있습니다. 바로 클래스의 생성자와는 별도로 정적 팩터리 메서드(static factory method)를 제공하는 것입니다. 대표적인 정적 팩터리 메서드로 Java 기본 타입의 박싱 클래스(boxed class) 에서 기본 타입을 인자로 받아서 박싱 클래스를 생성해주는 클래스가 있습니다. 예를들어 다음과 같은 박싱 클래스의 valueOf() 메서드가 있습니다. Boolean.valueOf(true); Integer.valueOf(1); Double.valueOf(3.0d); Character.valueOf('a'); String.valueOf(10).. 2021. 4. 17.