티끌모아 로키산맥 🏔
search
로ᄏl
배움에 끝은 없다... 개발 또한 그러하다.
Today
Yesterday
개발서적/이펙티브 자바 (35)
많은 클래스가 하나 이상의 자원에 의존한다. 예를들어 맞춤법 검사기는 사전에 의존하는데, 이런 클래스를 정적 유틸리티 클래스로 구현한 모습을 드물지 않게 볼 수 있다. public class SpellChecker { private static final Lexicion dictionary = ...; private SpellChecker() { } // 객체 생성 방지 public static boolean isValid(String word) { ... } public static List suggestions(String typo) { ... } } 비슷하게 싱글턴으로 구현하는 경우도 흔하다. public class SpellChecker { private final Lexicon dictionar..
이 책을 사주며 꼭 빨리 성장하라고 했던 선배(라고 부르고 은인 + 스승이라 부른다)의 당부를 잊고 벌써 몇개월을 소비한 것인가... 빨리 읽어야지 종종 단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때가 있다. 객체 지향적으로 사고하지 않는 이들이 종종 남용하는 방식이지만, 분명 나름 쓰임새가 있다. 예를들어 java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓을 수 있고, java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(or 팩터리)를 모아놓을 수도 있다(자바8부터는 이런 메서드를 인터페이스에 넣을 수 있다). 마지막으로, final 클래스와 관련한 메서드들을 모아놓을 때도 사용..
(이번 장은 잘 이해하지 못하는 부분이 많았다. 2회독 3회독을 하면서 이 부분이 점점 익숙해지기를 바란다..) 싱글톤(singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴의 대표적인 예는 함수와 같은 무상태(stateless) 객체나 (설계상 유일해야하는) 시스템 컴포넌트가 있다. 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문이다. 싱글턴을 만드는 방식은 보통 둘 중 하나이다. 두 방식 모두 생성자는 private로 감춰두고, 유일한 인스턴스에 접근하는 수단으로 public static 멤버를 하나 만든다. 첫번째 방법. public static 멤버가 final 필..
아이템 1에서 언급한 정적 팩터리와 생성자에게는 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 공통적인 제약사항이 있다. 식품 포장의 영양정보를 포함하는 클래스를 생각해보자. 영양정보는 1회 내용량, 총 n회 제공량, 1회 제공량당 칼로리같은 필수 항목 몇개와 총 지방, 트랜스지방, 포화지방, 콜레스테롤, 나트륨 등 총 20개가 넘는 선택 항목으로 이뤄진다. 그런데 대부분 제품은 이 선택 항목 중 대다수의 값이 0이다. 이런 클래스용 생성자 혹은 정적 팩터리는 어떤 모습일까? 프로그래머들은 이럴 때 점층적 생성자 패턴(telescoping constructor pattern)을 즐겨 사용했다. 필수 매개변수만 받는 생성자, 필수 매개변수와 선택 매개변수 1개를 받는 생성자, 선택 매개변수를 2개까지..
클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자다. 하지만 클래스는 생성자와 별도로 정적 팩터리 메서드를 제공할 수 있다. (클래스의 인스턴스를 반환하는 단순한 정적 메서드를 말하는게 맞다!) 다음 코드는 boolean 기본 타입의 박싱 클래스인 Boolean에서 발췌한 간단한 예다. public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 클래스는 클라이언트에 public 생성자 대신 정적 팩터리 메서드를 제공할 수 있다고 했다. (같이 제공할수도 있다) 이 방식에는 장점, 단점이 모두 존재한다. 먼저 장점 다섯 가지에 대해 알아본다. 장점 1. 이름을 가질 수 있다. 생성자에 넘기..