Book
-
Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라Book/Effective Java 3E 2022. 10. 10. 08:47
사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않습니다. 맞춤법 검사기 클래스(SpellChecker)는 여러 자원 인스턴스(언어별 사전 or 특수 어휘용 사전 등)를 지원해야 하며, 클라이언트가 원하는 자원(dictionary)을 사용해야 합니다. 이 조건을 만족하는 간단한 패턴이 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식입니다. 이는 의존 객체 주입의 한 형태로, 맞춤법 검사기를 생성할 때 의존 객체인 사전을 주입해주면 됩니다. // 의존 객체 주입은 유연성과 테스트 용이성을 높여줍니다. public class SpellChecker { private final Lexicon dictionary; public SpellChecker(Le..
-
Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라Book/Effective Java 3E 2022. 10. 7. 08:59
정적 메서드와 정적 필드만을 담은 클래스(java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들, java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(혹은 팩터리), final 클래스와 관련한 메서드들을 모아놓을 때 사용)는 인스턴스로 만들어 쓰려고 설계한 게 아닙니다. 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어줍니다. 즉, 매개변수를 받지 않는 public 생성자가 만들어집니다. private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있습니다. package effectivejava.chapter2.item4; // 코드 4-1 인스턴스를 만들 수 없는 유틸리티 클래스 pu..
-
Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라Book/Effective Java 3E 2022. 10. 7. 08:39
싱글턴(singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말합니다.[Gamma95] 싱글턴의 전형적인 예로는 함수와 같은 무상태(stateless) 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있습니다. 그런데 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있습니다. 싱글턴 생성 방식 1. final 필드 package effectivejava.chapter2.item3.field; // 코드 3-1 public static final 필드 방식의 싱글턴 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { } public void lea..
-
Item 2. 생성자에 매개변수가 많다면 빌더를 고려하라Book/Effective Java 3E 2022. 10. 3. 08:53
정적 팩터리와 생성자에는 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 제약사항이 있습니다. 대안 1. 점층적 생성자 패턴(telescoping constructor pattern) package effectivejava.chapter2.item2.telescopingconstructor; // 코드 2-1 점층적 생성자 패턴 - 확장하기 어렵다. public class NutritionFacts { private final int servingSize; // (mL, 1회 제공량) 필수 private final int servings; // (회, 총 n회 제공량) 필수 private final int calories; // (1회 제공량당) 선택 private final int fat; // (..
-
Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라Book/Effective Java 3E 2022. 10. 2. 10:53
클래스는 생성자와 별도로 정적 팩터리 메서드(static factory method)를 제공할 수 있습니다. 그 클래스의 인스턴스를 반환하는 단순한 정적 메서드입니다. // 생성자 private final boolean value; public Boolean(boolean value) { this.value = value; } // 정적 팩터리 메서드 public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 장점 이름을 가질 수 있습니다. 정적 팩터리는 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있습니다. 예컨대 생성자인 BigInteger(int, int, Random)과 정적 팩터리 메서드인 ..
-
객체지향의 사실과 오해 (5)Book/객체지향의 사실과 오해 2022. 10. 2. 08:13
07. 함께 모으기 코드와 모델을 밀접하게 연관시키는 것은 코드에 의미를 부여하고 모델을 적절하게 한다. - 에릭 에반스(Eric Evans)[Evans 2003] 마틴 파울러는 [UML Distilled 2판][Fowler 1996b]에서 객체지향 설계 안에 존재하는 세 가지 상호 관점에 관해 설명한다. 파울러는 세 가지 관점을 각각 개념 관점, 명세 관점, 구현 관점이라고 부른다. 개념 관점(Conceptual Perspective)에서 설계는 도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현한다. 도메인이란 사용자들이 관심을 가지고 있는 특정 분야나 주제를 말하며 소프트웨어는 도메인에 존재하는 문제를 해결하기 위해 개발된다. 이 관점은 사용자가 도메인을 바라보는 관점을 반영한다. 따라서 실제 ..
-
객체지향의 사실과 오해 (4)Book/객체지향의 사실과 오해 2022. 9. 25. 09:23
06. 객체 지도 유일하게 변하지 않는 것은 모든 것이 변한다는 사실뿐이다. - 헤라클레이토스(Heraclitus of Ephesus) 모든 소프트웨어 제품의 설계에는 두 가지 측면이 존재한다. 하나는 '기능(function)' 측면의 설계이고, 다른 하나는 '구조(structure)' 측면의 설계다. 기능 측면의 설계는 제품이 사용자를 위해 무엇을 할 수 있는지에 초점을 맞춘다. 구조 측면의 설계는 제품의 형태가 어떠해야 하는지에 초점을 맞춘다. 설계의 가장 큰 도전은 기능과 구조라는 두 가지 측면을 함께 녹여 조화를 이루도록 만드는 것이다. 구조는 사용자나 이해관계자들이 도메인(domain)에 관해 생각하는 개념과 개념들 간의 관계로 표현한다. 기능은 사용자의 목표를 만족시키기 위해 책임을 수행하는 ..
-
객체지향의 사실과 오해 (3)Book/객체지향의 사실과 오해 2022. 9. 25. 04:44
05. 책임과 메시지 의도는 "메시징"이다. 훌륭하고 성장 가능한 시스템을 만들기 위한 핵심은 모듈 내부의 속성과 행동이 어떤가보다는 모듈이 어떻게 커뮤니케이션하는가에 달려 있다. - 앨런 케이[Kay 1998] 객체지향 공동체를 구성하는 기본 단위는 '자율적'인 객체다. 객체들은 애플리케이션의 기능을 구현하기 위해 협력하고, 협력 과정에서 각자 맡은 바 책임을 다하기 위해 자율적으로 판단하고 행동한다. 자율적인 책임의 특징은 객체가 '어떻게(how)' 해야 하는가가 아니라 '무엇(what)'을 해야 하는가를 설명한다는 것이다. 객체지향 프로그래밍에서 행동은 수행할 책임을 지닌 객체에게 전송된 메시지에 의해 시작된다. 메시지는 행동에 대한 요청을 표현하고, 요청을 수행하는 데 필요한 추가적인 정보를 인자..