생성 - 빌더 패턴빌더 패턴동일한 인터페이스를 이용하여 여러 종류의 제품을 생성할 수 있다.복잡한 물체를 동일 인터페이스를 이용하여 단계적으로 구현할 수도 있다. 빌더 패턴이 필요한 이유상황여러 종류의 제품을 만들 수 있어야 하는 경우 1. 상속을 이용방법 : 기본 클래스를 확장하여 구현체별 서브 클래스를 생성한다.문제점 : 구현체별 너무 많은 하위 클래스가 생성된다.2. 가능한 경우에 대한 매개변수 생성방법 : 모든 가능한 경우에 대해 생성자에 매개변수를 추가한다.문제점 : 대부분의 경우 대부분의 매개변수가 사용되지 않는다.3. 빌더 패턴 사용하는 경우방법 : 객체 구성 코드를 빌더라는 개별 객체로 옮긴다.장점 : 필요한 단계만 선택하여 객체를 생성할 수 있다. 구조빌더 : 제품 생성의 공통 단계를 인..
생성 - 추상 팩토리 패턴추상 팩토리연관된 여러 객체들을 일관된 방식으로 생성할 때 사용하는 패턴추상 팩토리의 다른 이름은 키트(Kit)이다. 테마 별로 각 구현체 집합을 생성할 수 있다.팩토리 메서드 패턴은 단일 제품(Only one)을 생성하지만, 추상 팩토리 패턴은 여러 제품군을 생성한다. 생성 방법각 제품의 인터페이스를 정의한다.interface Chair { void sitOn();}interface Sofa { void lieOn();}interface CoffeeTable { void putCoffee();}제품들을 생성할 추상 팩토리를 생성한다.생성할 각 제품들의 인터페이스를 참조한다.interface FurnitureFactory { Chair createChair(..
생성 패턴 : 팩토리 메서드 패턴팩토리 메서드 패턴이란?생성과 구현의 분리객체 생성을 위한 인터페이스(or 상위 클래스)를 정의하고, 실제 어떤 클래스가 생성될지는 구현 클래스(or 하위 클래스)가 결정한다.어떤 구현 객체가 실제 생성되었는지 Client는 알지 못한다. (결합도가 낮다.) 팩토리 메서드 패턴이 필요한 이유모든 코드가 특정 객체에 결합도가 높게 작성되었다면, 다른 객체가 해당 객체를 대체하거나 새로운 객체를 포함할 때 많은 코드를 변경해야 한다.공통 로직마다 구현체별로 분기 처리가 필요하다.팩토리 메서드 패턴을 이용하면 Client는 인터페이스만 참조하고 특정 구현체에 종속되어있지 않으므로 확장성이 커진다.새로운 객체가 추가되거나 대체되더라도 인터페이스가 변하지 않는 이상 다른 코드에 영..
디자인 패턴디자인 패턴이란?소프트웨어 설계에서 일반적으로 발생하는 문제에 대한 일반적인 솔루션여러 문제들이 공통된 원인에 의한 것이라면, 패턴을 이용하여 같은 구조로 문제를 해결할 수 있다.ex) 관찰자 패턴을 이용하여 알림이 필요한 모든 상황에 적용하기 단순 개념(blueprint)이며, 고정된 특정 코드가 아니다.한 패턴에 여러 다양한 구현체가 존재할 수 있다.결과와 기능은 정해져있지만, 구현 순서와 방법은 다를 수 있다. 디자인 패턴을 공부하는 것의 장점소프트웨어 설계에서 문제가 발생했을 때 디자인 패턴을 이용해 해결할 수 있다.팀원과 의사소통할 때 디자인 패턴 개념을 공유하면 효율적으로 의사소통할 수 있다. 디자인 패턴을 적용할 때 주의할 부분"프로그램 맥락을 고려하지 않고 패턴을 일반적으로 적용..
18. 상속보다는 컴포지션을 사용하라상속상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다.잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 된다.상속이 안전할 때상위 클래스와 하위 클래스가 모두 같은 패키지이다.확장할 목적으로 설계되었고 문서화도 잘 된 클래스이다.다른 패키지의 구체 클래스를 상속하는 것은 위험하다.내부 구현을 잘 알지 못하고 오버라이드할 수 있다.내부 구현이 변경되었을때 외부 패키지의 상속받은 클래스가 적절히 알지 못할 수 있다.여기서 말하는 상속은 구현 상속을 말하며, 인터페이스 상속과는 무관하다. 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다.상위 클래스가 어떻게 구현되냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다.상위 클래스는 릴리즈마다 내부 구현이 달라질 수..
17. 변경 가능성을 최소화하라 불변 클래스인스턴스의 내부 값을 수정할 수 없는 클래스String, 내부 값으로 박싱된 클래스들, BigInteger, BigDecimal....블변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다. 불변 클래스로 만드는 방법1. 객체의 상태를 변경하는 메서드(변경자-setter)를 제공하지 않는다.2. 클래스를 확장할 수 없도록 한다. (final 클래스)하위 클래스에서 상위 클래스의 불변 조건을 깨뜨릴 수 있다.하위 클래스에서 가변 필드를 추가하거나 오버라이드하여 불변성을 해칠 수 있다.3. 모든 필드를 final로 선언한다.4. 모든 필드를 private으로 선언한다.외부에서 접근하지 못하게 하면 내부 구현 변경시에..
public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라.public 인스턴스 필드만 모아놓은 클래스는 캡슐화를 지키지 못한다.class Point{ public double x; public double y;} 단점 1. 내부 표현을 변경하기 위해 API(public 메서드와 필드)를 수정해야 한다.좋지 않은 예시public class BadDesign { public List names; // 직접 접근 가능한 public 필드 public BadDesign() { names = new ArrayList(); } public void addName(String name) { names.add(name); } pub..
15. 클래스와 멤버의 접근 권한을 최소화하라.캡슐화잘 설계된 컴포넌트란?캡슐화가 잘 지켜진 컴포넌트이다.클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 잘 숨긴다.모든 내부 구현을 완벽히 숨겨, 구현(내부 로직)과 API(public, 외부 공개)를 깔끔하게 분리한다.오직 API를 통해서만 다른 컴포넌트와 소통하며, 서로의 내부 동작 방식에는 전혀 개의치 않는다.public class BankAccount { private double balance; // 내부 구현 // API (외부 공개) public void deposit(double amount) { if (amount > 0) { balance += amount; } ..