본문 바로가기
반응형

분류 전체보기120

Item5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글턴 클래스 방식이 적합하지 않다. - 유연하지 않고 테스트하기 어렵다!! 예를 들어 SpellChecker가 Dictionary를 사용하고 Dictionary를 정적 유틸리티 클래스 혹은 싱글턴 클래스 방식으로 만들었다면 하나의 사전에 대해서만 SpellChecker를 작동시킬 수 있다. 하지만 국적에 따라 다른 사전을 사용한다면 유연하게 변경할 수 없으며 다른 국적의 사전은 테스트도 어려워진다. // 정적 유틸리티 클래스 public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // 객체 생성 방지 publi.. 2022. 12. 7.
Item4 인스턴스화를 막으려거든 private 생성자를 사용하라 단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때가 있을 것이다. static 메서드와 static 필드만을 사용하는 것은 객체지향적으로 사고하지 않는 이들이 종종 남용하는 방식 하지만 분명 나름의 쓰임새가 있다. -> java.lang.Math와 java.util.Arrays 처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓을 수 있다. 정적 메서드와 정적 필드만을 담은 유틸리티 클래스 java.lang.Math, java.util.Arrays 특히 java.util.Collections는 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(혹은 팩터리) 모음이다 final 클래스와 관련한 메서들을 모음 (final 클래스를 상속해 하위 클래스에 메서드를 넣는 건 불가능하기 때문.. 2022. 12. 6.
Item3 private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴(Singleton): 인스턴스를 오직 하나만 생성할 수 있는 클래스 ex) 무상태(stateless) 객체, 유일해야 하는 시스템 컴포넌트 싱글턴의 장점 고정된 메모리 영역을 사용하므로 메모리 낭비를 방지할 수 있다 전역 인스턴스이므로 다른 클래스의 인스턴스가 데이터 공유하기 쉬움 DB 커넥션 단점으로 아무 객체가 자유롭게 접근하고 수정하고 공유한다는 것은 객체지향에서는 권장되지 않음 -> static 필드와 메소드로만 구성된 클래스를 사용하는 것을 권장! 인스턴스가 1개임을 보장 두 번째 이용 부터는 객체 로딩 시간이 줄어 성능 향상 싱글턴의 단점 테스트가 어렵다 타입을 인터페이스로 정의한 다음 인터페이스를 구현해 만든 싱글턴이 아니라면 인스턴스를 mock 구현으로 대체하기 어려움 결합도가 높아.. 2022. 12. 2.
Item 2 생성자에 매개변수가 많다면 빌더를 고려하라 정적 팩터리와 생성자의 제약 선택적 매개변수가 많을 때 적절히 대응하기 어렵다 매개변수가 5개인데 경우에 따라 0개 ~ 5개의 매개변수에 값을 넣어서 생성한다면 어떻게 대응해야 하는가? 점층적 생성자 패턴(telescoping constructor pattern) public class NutritionFacts { private final int servingSize;// (ml, 1회 제공량)필수 private final int servings;// (회, 총 n회 제공량)필수 private final int calories;// (1회 제공량당)선택 private final int fat;// (g/1회 제공량)선택 private final int sodium;//선택 private final in.. 2022. 12. 1.
반응형