요약 상태 패턴 상태 기계 기초 지식 알아보기 뽑기 기계 코드 만들기 알림! 뽑기 기계 코드 수정 요청 요청 사항 살펴보기 메모 CHAPTER 10. 객체의 상태 바꾸기 : 상태 패턴 상태 기계 기초 지식 알아보기 간단한 상태 기계 구현 방법 우선 상태들을 모아 봄. ex) 동전 없음, 동전 있음, 알맹이 매진, 알맹이 판매 → 총 4개의 상태가 있음. 현재 상태를 저장하는 인스턴스 변수를 만들고 각 상태의 값을 정의함. final static int SOLD_OUT = 0; final static int NO_QUATER = 1; final static int HAS_QUATER = 2; final static int SOLD = 3; int state = SOLD_OUT; 이 시스템에서 일어날 수 있..
요약 반복자 패턴과 컴포지트 패턴 컴포지트 패턴으로 메뉴 디자인하기 메뉴 구성 요소 구현하기 메뉴 항목 구현하기 메뉴 구현하기 종업원 코드에 컴포지트 적용하기 디자인 도구상자 안에 들어가야 할 도구들 메모 컴포지트 패턴으로 메뉴 디자인하기 구성 요소 인터페이스를 먼저 만듦. 메뉴와 메뉴 항목 모두에 적용되는 공통 인터페이스 역할을 함. 메뉴와 메뉴 항목을 똑같은 방법으로 처리할 수 있음. → 같은 메소드를 호출할 수 있음. Waitress 클래스는 MenuComponent 인터페이스를 사용해서 Menu와 MenuItem에 모두 접근함. MenuComponent는 MenuItem과 Menu 모두에 적용되는 인터페이스임. MenuItem과 Menu에서 모두 print()를 오버라이드 함. MenuItem에서..
요약 반복자 패턴과 컴포지트 패턴 반복자와 컬렉션 리팩터링 준비하기 컴포지트 패턴의 정의 메모 반복자와 컬렉션 컬렉션과 반복자를 사용하면 모든 컬렉션 객체에서 자신을 대상으로 하는 반복자를 리턴할 줄 안다는 장점을 활용할 수 있음. ArrayList의 iterator() 메소드를 호출하면 ArrayList용 구상 Iterator 클래스가 리턴됨. 구상 클래스의 구현은 신경쓰지 않고, Iterator 인터페이스만 사용하면 됨. HashMap은 반복자를 간접적으로 지원하는 클래스임. 2개의 객체 모듬이 들어있음. → keys, values 값들을 대상으로 반복작업을 하고 싶다면, HashMap 의 values 를 가져온 다음에 반복자를 받아와야 함. 만약, 메뉴 안에 서브 메뉴를 지원해달라고 한다면? ex)..
요약 반복자 패턴과 컴포지트 패턴 단일 역할 원칙 Iterable 인터페이스 알아보기 향상된 for 순환문 알아보기 객체마을 카페 메뉴 살펴보기 객체마을 카페 메뉴 코드 고치기 메모 단일 역할 원칙 집합체에서 내부 컬렉션 관련 기능 반복자용 메소드 관련 기능 전부 구현하면, 한 클래스에 2가지 역할을 가짐. 만약, 컬렉션이 어떤 이유로 바뀌게 되면 그 클래스가 바뀌어야함. 또, 반복자 관련 기능이 바뀌더라도 그 클래스가 바뀌어야 함. 이러한 이유로 ‘변경’과 관련된 디자인 원칙이 추가됨. 📍 디자인 원칙 : 어떤 클래스가 바뀌는 이유는 하나뿐이어야 한다. 클래스를 고치는 일은 최대한 피해야 함. 코드 변경이 일어나면 여러 문제가 발생할 수 있기 때문. 코드 변경 이유가 2가지나 되면, 그만큼 그 클래스를..
요약 반복자 패턴과 컴포지트 패턴 반복자 패턴 객체마을 식당 메뉴에 반복자 추가하기 객체마을 식당 메뉴에서 반복자 사용하기 종업원 코드에 반복자 적용하기 반복자 패턴의 특징 알아보기 인터페이스 개선하기 java.util.Iterator 적용하기 반복자 패턴의 정의 반복자 패턴의 구조 알아보기 메모 반복자 패턴 반복자(iterator) 패턴이라고 부름. Iterator 인터페이스에 의존함. hasNext() 메소드를 사용하면 반복 작업을 적용할 대상이 더 있는지 확인 가능 next() 메소드는 다음 객체를 리턴함. 이 인터페이스가 있으면 배열, 리스트, 해시 테이블은 물론, 모든 종류의 객체 컬렉션에 반복자를 구현할 수 있음. 객체마을 식당 메뉴에 반복자 추가하기 public interface Iterat..
요약 템플릿 메소드 패턴 디자인 도구상자 안에 들어가야 할 도구들 템플릿 메소드 패턴 반복자 패턴과 컴포지트 패턴 객체 마을 식당과 팬케이크 하우스 합병 자격 요건 구현하기 반복을 캡슐화하기 메모 디자인 도구상자 안에 들어가야 할 도구들 템플릿 메소드 패턴 알고리즘의 골격을 정의함. 템플릿 메소드를 사용하면 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브클래스에서 재정의할 수도 있음. 컬렉션 잘 관리하기 : 반복자 패턴과 컴포지트 패턴 객체 마을 식당과 팬케이크 하우스 합병 객체마을 식당 메뉴는 배열로 구현함. 팬케이크 하우스는 메뉴를 ArrayList로 구현함. 이 두 식당의 합병 → 메뉴를 통합해야함. 종업원이 각 객체 메뉴들을..
Sharing data across languages syntax = "proto3" message MyMessage { uint32 id = 1; } 위 프로토타입 스키마를 통해, 자바, 파이썬, 고랭, 그외 여러 다른 언어의 코드를 생성할 수 있음. 직렬화 .proto 파일에서 프로토콜 버퍼를 사용하여 데이터 구조를 정의한 경우, 프로토콜 버퍼 컴파일러 (protoc)를 사용하여 대상 언어로 코드를 생성함. (Java, C++, Python, Go) 생성된 코드에는 정의한 데이터 유형에 해당하는 클래스, 혹은 구조체가 포함됨. 클래스 또는 구조체 인스턴스를 생성해서 해당 필드에 값을 설정할 수 있음. 데이터 구조 필드 중 하나는 일반적으로 고유 식별자, ID로 지정됨. 데이터 구조에 값을 설정하고, ..
데이터 직렬화의 세계에는 선택할 수 있는 옵션이 많음. XML, JSON, Protocol Buffers Protocol Buffers → language-neutral, platform-neutral Protocol Buffer Message 예시 syntax = "proto3"; import "google/protobuf/timestamp.proto"; message User { uint32 id = 1; string lname = 2; string fname = 3; google.protobuf.Timestamep bday = 4; } 데이터 자체와 데이터 스키마를 분리함. 프로토콜 버퍼의 이점 1. 강력한 타입 지정 위 프로토콜 버퍼 메시지의 경우, uint32, string, timestamp를..
요약 템플릿 메소드 패턴 자바 API 속 템플릿 메소드 패턴 알아보기 템플릿 메소드로 정렬하는 방법 오리 정렬하기 오리 대소 비교 템플릿 메소드로 그래픽 출력하기 메모 자바 API 속 템플릿 메소드 패턴 알아보기 야생에서도 이 패턴은 쉽게 발견할 수 있음. 패턴 교과서의 예시와 다른 모양으로 구현한 템플릿 메소드도 많음. 주의 깊게 살펴보면 템플릿 메소드임을 알 수 있음. 이 패턴이 자주 쓰이는 이유는 프레임워크를 만드는 데 아주 훌륭한 디자인 도구이기 때문임. 템플릿 메소드로 정렬하는 방법 자바의 Arrays 클래스에는 정렬할 때 쓸 수 있는 편리한 템플릿 메소드가 포함되어 있음. mergeSort 메소드에 정렬 알고리즘이 들어있음 compareTo() 메소드에 의해 결과가 결정됨. 이게 템플릿 메소드..
요약 템플릿 메소드 패턴 Coffee 클래스와 Tea 클래스 추상화하기 추상화 방법 들여다보기 템플릿 메소드 패턴 알아보기 템플릿 메소드 패턴의 정의 템플릿 메소드 속 후크 알아보기 메모 Coffee 클래스와 Tea 클래스 추상화하기 Coffee 와 Tea 의 상위 클래스인 CaffeineBeverage 를 추상화함. 공통으로 사용되는 메소드를 슈퍼 클래스에 정의함. 추상화 방법 들여다보기 커피와 홍차는 제조법이 똑같음. prepareRecipe 메서드를 추상화한다. 커피를 필터로 우려내는 것은 티백을 물에 넣어서 홍차를 우려내는 일과 별반 다르지 않음. 따라서, brew 메소드를 만들어서 똑같은 메소드를 쓰도록 함. 추상 클래스에 이 prepareRecipe 메소드를 사용함. CaffeineBevera..
요약 퍼사드 패턴과 최소 지식 원칙 디자인 도구상자 안에 들어가야 할 도구들 알고리즘 캡슐화하기 : 템플릿 메소드 패턴 커피와 홍차 만들기 Coffee 클래스와 Tea 클래스 만들기 메모 퍼사드 패턴과 최소 지식 원칙 클라이언트의 친구는 퍼사드 하나만 있는 것이 좋음. 서브 시스템에서도 최소 지식 원칙을 최대한 지키는 것이 좋음. 서로 얽혀 있는 친구가 너무 많아서 시스템이 복잡하면 퍼사드를 추가하는게 좋음. 디자인 도구상자 안에 들어가야 할 도구들 객체지향 원칙 진짜 절친에게만 이야기해야 함. 최소 결합을 해야 한다는 사실을 알려주는 새로운 원칙이 추가됨. 어댑터 패턴 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환함. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용..
요약 어댑터 패턴과 퍼사드 패턴 퍼사드 작동 원리 알아보기 홈시어터 퍼사드 만들기 단순화된 인터페이스 만들기 편한 방법으로 영화 보기 퍼사드 패턴의 정의 최소 지식 원칙 친구를 만들지 않고 다른 객체에 영향력 행사하기 절친에게만 메소드 호출하기 메모 퍼사드 작동 원리 알아보기 쓰기 쉬운 인터페이스를 제공하는 퍼사드 클래스를 구현하면 복잡한 시스템을 훨씬 편리하게 사용할 수 있음. 물론, 복잡한 시스템을 직접 건드리고 싶다면 기존 인터페이스를 그대로 쓰면 됨. 홈시어터 시스템용 퍼사드를 만든다. watchMovie() 와 같은 몇가지 간단한 메소드만 들어있는 HomeTheaterFacade 클래스를 새로만들어야 함. 퍼사드 클래스는 홈시어터 구성 요소를 하나의 서브시스템으로 간주하고 watchMovie()..