요약 객체지향 빵 굽기 : 팩토리 패턴 원재료 팩토리 만들기 뉴욕 원재료 팩토리 만들기 Pizza 클래스 변경하기 바뀐 내용 되돌아보기 새로운 코드로 또 피자 주문하기 New! 피자가 만들어지기까지 메모 원재료 팩토리 만들기 public interface PizzaIngredientFactory { public Dough createDough(); public Sauce createSauce(); public Cheese createCheese(); public Veggies[] createVeggies(); public Pepperoni createPepperoni(); public Clams createClam(); } 원재료별 생성 메소드를 정의함. 뉴욕 원재료 팩토리 만들기 public class..
요약 객체지향 빵 굽기 : 팩토리 패턴 병렬 클래스 계층 구조 알아보기 팩토리 메소드 패턴의 정의 객체 의존성 살펴보기 의존성 뒤집기 원칙 의존성 뒤집기 원칙 적용하기 의존성 뒤집기 원칙을 지키는 방법 원재료 종류 알아보기 원재료군으로 묶기 메모 병렬 클래스 계층 구조 알아보기 생산자 클래스와 거기에 대응되는 제품 클래스는 병렬 계층구조로 볼 수 있음. 둘다 추상 클래스로 시작하고, 그 클래스를 확장하는 구상 클래스들이 지점과, 피자를 만드는 구체적인 구현을 담당함. 팩토리 메소드 패턴의 정의 📍 팩토리 메소드 패턴(Factory Method Pattern) : 객체를 생성할 때 필요한 인터페이스를 만듦. 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정함. 팩토리 메소드 패턴을 사용하면 클래스 인스..
요약 객체지향 빵 굽기 : 팩토리 패턴 다양한 팩토리 만들기 서브클래스가 결정하는 것 알아보기 피자 스타일 서브클래스 만들기 팩토리 메소드 선언하기 피자 팩토리 메소드로 피자 주문하기 Pizza 클래스 만들기 최첨단 피자 코드 테스트 팩토리 메소드 패턴 살펴보기 생산자 클래스 제품 클래스 메모 다양한 팩토리 만들기 각 지점마다 그 지역의 특성과 입맛을 반영한 다양한 스타일의 피자를 만든다면? 피자 프랜차이즈 사업을 시작한다. SimplePizzaFactory를 삭제하고, NyPizzaFactory, ChicagoPizza, CaliforniaPizzaFactory를 만들어야 함. PizzaStore는 적당한 팩토리를 사용하도록 한다. NyPizzaFactory nyFactory = new NYPizzaF..
요약 객체지향 빵 굽기 : 팩토리 패턴 최첨단 피자 코드 만들기 객체 생성 부분 캡슐화하기 객체 생성 팩토리 만들기 클라이언트 코드 수정하기 ‘간단한 팩토리’의 정의 메모 CHAPTER 04. 객체지향 빵 굽기 : 팩토리 패턴 new 연산자는 구상 클래스의 인스턴스를 생성함. 인터페이스가 아닌 특정 구현을 사용하는 것임. 만약 다형성을 이용하여, 실행 시에 동적으로 인스턴스 형식을 조건에 따라 구상 클래스를 다르게 생성하고 싶다면, 특정 if 문을 사용해야 함. 변경하거나 확장해야할 때 코드 변경이 불가피함. 최첨단 피자 코드 만들기 Pizza orderPizza(String type) { Pizza pizza; if (type.equals("cheese")) { pizza = new CheesePizz..
요약 객체 꾸미기 (데코레이터 패턴) 계속 Beverage 클래스 장식하기 커피 주문 시스템 코드 만들기 음료 코드 구현하기 첨가물 코드 구현하기 커피 주문 시스템 코드 테스트 데코레이터가 적용된 예 : 자바 I/O 자바 I/O 데코레이터 만들기 디자인 도구상자 안에 들어가야 할 도구들 추가 OCP 데코레이터 패턴 메모 Beverage 클래스 장식하기 CondimentDecorator (첨가물 데코레이터)는 꾸밀 대상인 Beverage 객체를 상속함. 상속을 통해, 데코레이터 객체가 자신이 감싸고 있는 객체랑 같은 형식을 맞춘다. 데코레이터가 꾸밀 대상을 구성으로 가지고 있기 때문에 행동(비용 계산)을 실행중에 동적으로 설정할 수 있음. 음료에 첨가물이 추가되도 유연성을 잃지 않음. 커피 주문 시스템 코..
요약 객체 꾸미기 (데코레이터 패턴) 초대형 커피 전문점, 스타버즈 OCP 살펴보기 데코레이터 패턴 살펴보기 주문 시스템에 데코레이터 패턴 적용하기 데코레이터 패턴의 정의 메모 CHAPTER 03. 객체 꾸미기 (데코레이터 패턴) 데코레이터 패턴을 이용하면 기존 클래스 코드를 바꾸지 않고도 객체에 새로운 임무를 추가할 수 있음. 초대형 커피 전문점, 스타버즈 초기 스타버즈의 주문 시스템은 다음과 같음. Beverage 추상 클래스 서브 클래스는 음료들 여기서 문제는, 음료에 우유, 두유, 모카, 휘핑크림을 추가할 때마다 그에 대한 서브 클래스를 만들었음. 클래스가 너무 많아지는 문제가 생김. 그래서, 인스턴스 변수로 첨가물을 관리하면 어떨지 생각함. 첨가물에 대한 비용을 인스턴스로 관리하면, cost 메..
요약 객체들에게 연락 돌리기 (옵저버 패턴) 계속 인생을 바꿀 애플리케이션 만들기 옵저버로 알림이 가는 순서에 의존하지 말기 푸시를 풀로 바꾸기 옵저버가 필요한 데이터를 골라서 가져가도록 만드는 방법이 더 좋음 옵저버 패턴의 디자인 원칙 옵저버 패턴을 통해 디자인 원칙을 하나씩 확인할 수 있음. 메모 인생을 바꿀 애플리케이션 만들기 p101 ~ 102 참고 자바에는 Observable 클래스와, Observer 인터페이스가 있음. 이 클래스들은 자바 9 이후로 쓰이지 않음. 각자 자신의 코드에서 기본적인 옵저버 패턴을 직접 구현하는게 더 편하다고 생각하는 사람이 늘어남. 자바 Bean이나 비동기 스트림을 처리하는 Flow API에서 옵저버 패턴을 이용한 기능들을 제공함. 주제 → 옵저버로 알림이 가는 순..
요약 객체들에게 연락 돌리기 (옵저버 패턴) 계속 옵저버 패턴의 정의 옵저버 패턴의 구조 느슨한 결합의 위력 기상 스테이션 구현하기 Subject 인터페이스 구현하기 디스플레이 요소 구현하기 메모 옵저버 패턴의 정의 📍 옵저버 패턴(Observer Pattern) : 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의함. 주제와 옵저버로 일대다 관계가 정의됨. 옵저버는 주제에 딸려있음. 옵저버 패턴의 경우, 보통 주제 인터페이스와 옵저버 인터페이스가 들어있는 클래스 디자인으로 구현됨. 옵저버 패턴의 구조 주제를 나타내는 Subject 인터페이스 각 주제마다 여러개의 옵저버가 있을 수 있음. 옵저버가 될 가능..
요약 객체들에게 연락 돌리기 (옵저버 패턴) 기상 모니터링 애플리케이션 알아보기 WeatherData 클래스 살펴보기 구현 목표 기상 스테이션용 코드 추가하기 원칙으로 추가 코드 살펴보기 옵저버 패턴 이해하기 옵저버 패턴의 작동 원리 메모 CHAPTER 02. 객체들에게 연락 돌리기 (옵저버 패턴) 기상 모니터링 애플리케이션 알아보기 WeatherData 객체는 Weather-O-Rama에서 만든 물리 기상 스테이션과 통신해서 갱신된 기상 데이터를 가져옴. 디스플레이를 업데이트하려면 WeatherData 객체를 고쳐야 함. 우리는 WeatherData 객체로 현재 조건, 기상 통계, 기상 예보, 이 3가지 항목을 디스플레이 장비에서 갱신해 가면서 보여주는 애플리케이션을 만들어야 함. WeatherData..
요약 디자인 패턴 소개와 전략 패턴 (계속) 동적으로 행동 지정하기 캡슐화된 행동 살펴보기 두 클래스를 합치는 방법 첫 번째 디자인 패턴: 전략 패턴 디자인 패턴 만나기 패턴과 전문 용어 디자인 패턴 사용법 디자인 도구상자 안에 들어가야 할 도구들 메모 동적으로 행동 지정하기 Duck 서브클래스에서 세터 메서드를 호출하도록 설정한다. 캡슐화된 행동 살펴보기 Duck의 행동 집합 클래스로 분리하여 캡슐화함. 두 클래스를 합치는 방법 “A에는 B가 있다” 관계와 같이 두 클래스를 합치는 것을 구성(composition) 을 이용한다고 부름. Duck 클래스의 경우, 행동을 상속받는 대신, 올바른 행동 객체로 구성되어 행동을 부여받음. 이 구성 은 매우 중요한 테크닉이자, 세 번째 디자인 원칙임. 📍 세 번째..
요약 디자인 패턴 소개와 전략 패턴 (계속) 상속을 생각하기 인터페이스 설계하기 해결 방법 고민하기 소프트웨어 개발 불변의 진리 문제를 명확하게 파악하기 바뀌는 부분과 그렇지 않은 부분 분리하기 오리의 행동을 디자인하는 방법 오리의 행동을 구현하는 방법 오리 행동 통합하기 메모 상속을 생각하기 날고, 소리를 내는 오리를 구현하기 위해 상속을 한다면? 나무로된 가짜 오리를 추가해야 한다면..? 날수도 없고 소리를 낼 수도 없다. 그러면 그 서브클래스는 아무것도 하지 않도록 오버라이드를 계속해줘야 함. Duck의 행동을 상속할 때 단점이 될 수 있는 요소 서브클래스에서 코드가 중복된다. 실행 시에 특징을 바꾸기 힘들다. 모든 오리의 행동을 알기 힘들다. 코드를 변경했을 때 다른 오리들에게 원치 않은 영향을 ..
요약 디자인 패턴 소개와 전략 패턴 오리 시뮬레이션 게임 슈퍼 클래스에 메서드 추가 시, 특정 서브 클래스가 그걸 구현하고 싶지 않아도 무조건 구현해야 하는 문제 발생 메모 CHAPTER 01. 디자인 패턴의 세계로 떠나기 디자인 패턴 소개와 전략 패턴 다른 개발자가 우리와 똑같은 문제를 경험하면서 익혔던 지혜와 교훈을 살펴봄. 디자인 패턴의 활용 분야와 디자인 패턴으로 얻을 수 있는 장점을 알아봄. 몇 가지 핵심적인 객체지향 디자인 원칙을 살펴봄. 한 가지 패턴을 정해 디자인 원칙이 어떤식으로 작동하는지 알아봄. 패턴을 잘 사용하려면 패턴을 머릿속에 집어넣은 다음 애플리케이션에 어떻게 적용할지 파악해야 함. 디자인 패턴은 코드가 아닌 경험을 재사용 하는 것임. 오리 시뮬레이션 게임 Duck 상위 클래스..