SlideShare una empresa de Scribd logo
1 de 14
최범균 (madvirus@madvirus.net)
  blog: javacan.tistory.com
자판기의 동작 방식

동작(이벤트)   조건           실행       결과

동전을 넣는다   동전 없음이면      금액을 추가   제품 선택 가능

동전을 넣는다   제품 선택 가능이면   금액을 증가   제품 선택 가능

제품 선택하면   동전 없음이면      아무 동작    동전 없음 유지
                       하지 않음

제품 선택하면   제품 선택 가능이면   제품 주고    잒액 있으면 제품 선택 가능
                       잒액 감소    잒액 없으면 동전 없음
조건 문을 이용한 구현
class VendingMachine {
    final int NOCOIN = 1;
    final int SELECTABLE = 2;

   insertCoin(int coin) {
       if (state == NOCOIN) {
           increaseCoin(coin);
                                           세척 중인 경우와
           state = SELECTABLE;
       } else if (state == SELECTABLE) {    품절인 경우도
           increaseCoint(coin);
                                           처리해야 한다…
       }
   }
   select(int productId) {
       if (state == NOCOIN) {
           doNothing();
       } else if (state == SELECTABLE) {
           provideProduct(productId);
           decreaseCoin();
           if (isNoCoin()) {
               state = NOCOIN;
           }
       }
   }
새로운 조건 추가

class VendingMachine {
    final int NOCOIN = 1;
    final int SELECTABLE = 2;
    final int CLEANING = 3;
                                         if-else 때문에
    final int SOLDOUT = 4;
                                      코드가 복잡해 질 것 같은
                                        불길한 냄새가 남
    insertCoin(int coin) {
        if (state == NOCOIN) {
            increaseCoin(coin);
            state = SELECTABLE;
        } else if (state == SELECTABLE) {
            increaseCoint(coin);
        } else if (state == CLEANING) {
            returnCoin();
        } else if (state == SOLDOUT) {
            returnCoin();
        }
    }
    …
}
처리 방식을 한번 더 생각해보면

      class VendingMachine {
          final int NOCOIN = 1;
          final int SELECTABLE = 2;
          final int CLEANING = 3;
          final int SOLDOUT = 4;
 상태에 따라
          insertCoin(int coin) {
동일한 요청의                                         상태에 의존하는
              if (state == NOCOIN) {
 처리가 바뀜                                          조건절이 많음
                  increaseCoin(coin);
                  state = SELECTABLE;
              } else if (state == SELECTABLE) {
                  increaseCoint(coin);
              } else if (state == CLEANING) {
                  returnCoin();
              } else if (state == SOLDOUT) {
                  returnCoin();
              }
          }
          …
      }
State 패턴은 언제?




상태에 따라서 동일한 요청을
다르게 처리해 주어야 할 때
State 패턴의 구조

                            State
   Context




Concrete
 State
Context
• 클라이언트가 필요한 기능(인터페이스) 제공
• 내부적으로 State에 요청 처리 위임

                                  class VendingMachine {
        VendingMachine                private State state;
-state : State
                                       public void insertCoin(int coin) {
+insertCoin(coin : int)                    state.insertCoint(coin, this);
                                       }
+selectProduct(productId : int)
+chageState(state : State)             public void selectProduct(int productId) {
                                           state.selectProduct(productId, this);
                                       }

                                       public void changeState(sState newState) {
                                           this.state = newState;
                                       }
                                  }
State & Concrete State
• State
  – 모든 상태에 공통된 기능 처리를 정의


• Concrete State - 특정 상태의 기능 처리를 구현
                  class NoCoinState implements State {

                      public void insertCoin(int coin,
                          VendingMachine machine) {
                        // 동전 증가
                        machine.changeState(selectableState);
                      }

                      public void selectProduct(
                            int productId,
                            VendingMachine machine) {
                        beep();
                      }
                  }
패턴 적용 후, 조건 문 → 여러 State
class VendingMachine {
    final int NOCOIN = 1;
                                             NoCoinState
    final int SELECTABLE = 2;
    final int CLEANING = 3;
    final int SOLDOUT = 4;

    insertCoin(int coin) {
                                            SelectableState
        if (state == NOCOIN) {
            increaseCoin(coin);
            state = SELECTABLE;
        } else if (state == SELECTABLE) {
            increaseCoint(coin);
                                             CleaingState
        } else if (state == CLEANING) {
            returnCoin();
        } else if (state == SOLDOUT) {
            returnCoin();
        }
                                            SoldOutState
    }
    …
}
구현 이슈 1 - State의 전이는 누가
• 안1, State에서 상태 전이 처리
   class ConcreteState implements State {
      public void behavior1(int coin, Context context) {
          // do something
          context.changeState(nextState);
      }
   }

 – State 구현 클래스 갂 커플링 발생
     NoCoinState                  SelectableState


     CleaningState

• 안2, Context에서 상태 전이 처리
 – Context의 코드가 다소 복잡해짐
구현 이슈 2 - 테이블 기반 구현
• 상태 전이를 표로 표현
  현재 상태   입력 값      다음 상태
  A       1         B
  A       2         C
  C       1         Z



• State 패턴과의 차이점
 – 테이블 기반 구현 - 상태의 전이에 초점
 – State 패턴 구현 - 상태에 특화된 기능 제공에 초점
State 패턴 정리
• 상태에 특정한 기능의 처리 구현을 여러 클래스
  에 분산
 – 새로운 상태 추가 용이
   • 새로운 State 구현 클래스 추가로 상태 추가 가능
 – 긴 조건문을 피할 수 있음
 – 클래스가 많아짐


• 상태 전이가 명시적
 – 상태 관련 코드가 구조화 됨
 – 코드의 구조나 의도를 명확하게 함
질문 있으세요?

Más contenido relacionado

La actualidad más candente

SRT Prometheus Exporter Introduction.pdf
SRT Prometheus Exporter Introduction.pdfSRT Prometheus Exporter Introduction.pdf
SRT Prometheus Exporter Introduction.pdfTomoya Fujita
 
(A09) LabMM3 - JavaScript - Estruturas de repetição
(A09) LabMM3 - JavaScript - Estruturas de repetição(A09) LabMM3 - JavaScript - Estruturas de repetição
(A09) LabMM3 - JavaScript - Estruturas de repetiçãoCarlos Santos
 
第2回 The Things Network(TTN)勉強会」 @柏の葉  オープンウェーブ尾鷲さん説明資料
第2回 The Things Network(TTN)勉強会」 @柏の葉  オープンウェーブ尾鷲さん説明資料第2回 The Things Network(TTN)勉強会」 @柏の葉  オープンウェーブ尾鷲さん説明資料
第2回 The Things Network(TTN)勉強会」 @柏の葉  オープンウェーブ尾鷲さん説明資料CRI Japan, Inc.
 
エルスピーナヴェインズ株式会社・会社概要
エルスピーナヴェインズ株式会社・会社概要エルスピーナヴェインズ株式会社・会社概要
エルスピーナヴェインズ株式会社・会社概要CRI Japan, Inc.
 
Fabia akcesoria 2006
Fabia akcesoria 2006Fabia akcesoria 2006
Fabia akcesoria 2006jacekpk
 
Bluetooth通信の 仕組みと活用法紹介
Bluetooth通信の仕組みと活用法紹介Bluetooth通信の仕組みと活用法紹介
Bluetooth通信の 仕組みと活用法紹介Takehiko YOSHIDA
 
Mau viet tai lieu srs
Mau viet tai lieu srsMau viet tai lieu srs
Mau viet tai lieu srstrinhtv_55
 
Configuración Dnssec con BIND
Configuración Dnssec con BINDConfiguración Dnssec con BIND
Configuración Dnssec con BINDFernando Parrondo
 
사물 인터넷을 넘어 지능형 사물 인터넷 시대로!_강지나 클라우드 솔루션 아키텍트
사물 인터넷을 넘어 지능형 사물 인터넷 시대로!_강지나 클라우드 솔루션 아키텍트사물 인터넷을 넘어 지능형 사물 인터넷 시대로!_강지나 클라우드 솔루션 아키텍트
사물 인터넷을 넘어 지능형 사물 인터넷 시대로!_강지나 클라우드 솔루션 아키텍트NAVER CLOUD PLATFORMㅣ네이버 클라우드 플랫폼
 
Task migration using CRIU
Task migration using CRIUTask migration using CRIU
Task migration using CRIURohit Jnagal
 

La actualidad más candente (12)

Luận văn: Kỹ thuật chuyển đổi Dual Stack 6vpe từ Ipv4 sang Ipv6
Luận văn: Kỹ thuật chuyển đổi Dual Stack 6vpe từ Ipv4 sang Ipv6Luận văn: Kỹ thuật chuyển đổi Dual Stack 6vpe từ Ipv4 sang Ipv6
Luận văn: Kỹ thuật chuyển đổi Dual Stack 6vpe từ Ipv4 sang Ipv6
 
SRT Prometheus Exporter Introduction.pdf
SRT Prometheus Exporter Introduction.pdfSRT Prometheus Exporter Introduction.pdf
SRT Prometheus Exporter Introduction.pdf
 
(A09) LabMM3 - JavaScript - Estruturas de repetição
(A09) LabMM3 - JavaScript - Estruturas de repetição(A09) LabMM3 - JavaScript - Estruturas de repetição
(A09) LabMM3 - JavaScript - Estruturas de repetição
 
第2回 The Things Network(TTN)勉強会」 @柏の葉  オープンウェーブ尾鷲さん説明資料
第2回 The Things Network(TTN)勉強会」 @柏の葉  オープンウェーブ尾鷲さん説明資料第2回 The Things Network(TTN)勉強会」 @柏の葉  オープンウェーブ尾鷲さん説明資料
第2回 The Things Network(TTN)勉強会」 @柏の葉  オープンウェーブ尾鷲さん説明資料
 
エルスピーナヴェインズ株式会社・会社概要
エルスピーナヴェインズ株式会社・会社概要エルスピーナヴェインズ株式会社・会社概要
エルスピーナヴェインズ株式会社・会社概要
 
LAN
LANLAN
LAN
 
Fabia akcesoria 2006
Fabia akcesoria 2006Fabia akcesoria 2006
Fabia akcesoria 2006
 
Bluetooth通信の 仕組みと活用法紹介
Bluetooth通信の仕組みと活用法紹介Bluetooth通信の仕組みと活用法紹介
Bluetooth通信の 仕組みと活用法紹介
 
Mau viet tai lieu srs
Mau viet tai lieu srsMau viet tai lieu srs
Mau viet tai lieu srs
 
Configuración Dnssec con BIND
Configuración Dnssec con BINDConfiguración Dnssec con BIND
Configuración Dnssec con BIND
 
사물 인터넷을 넘어 지능형 사물 인터넷 시대로!_강지나 클라우드 솔루션 아키텍트
사물 인터넷을 넘어 지능형 사물 인터넷 시대로!_강지나 클라우드 솔루션 아키텍트사물 인터넷을 넘어 지능형 사물 인터넷 시대로!_강지나 클라우드 솔루션 아키텍트
사물 인터넷을 넘어 지능형 사물 인터넷 시대로!_강지나 클라우드 솔루션 아키텍트
 
Task migration using CRIU
Task migration using CRIUTask migration using CRIU
Task migration using CRIU
 

Más de beom kyun choi

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개beom kyun choi
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기beom kyun choi
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나beom kyun choi
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)beom kyun choi
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀beom kyun choi
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugbeom kyun choi
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초beom kyun choi
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128beom kyun choi
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유beom kyun choi
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료beom kyun choi
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개beom kyun choi
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해beom kyun choi
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개beom kyun choi
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개beom kyun choi
 

Más de beom kyun choi (20)

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)
 
DDD 준비 서문래
DDD 준비 서문래DDD 준비 서문래
DDD 준비 서문래
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksug
 
MVP 패턴 소개
MVP 패턴 소개MVP 패턴 소개
MVP 패턴 소개
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유
 
Spring Boot 소개
Spring Boot 소개Spring Boot 소개
Spring Boot 소개
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
Zookeeper 소개
Zookeeper 소개Zookeeper 소개
Zookeeper 소개
 

패턴 스터디 발표 자료 - State 패턴

  • 1. 최범균 (madvirus@madvirus.net) blog: javacan.tistory.com
  • 2. 자판기의 동작 방식 동작(이벤트) 조건 실행 결과 동전을 넣는다 동전 없음이면 금액을 추가 제품 선택 가능 동전을 넣는다 제품 선택 가능이면 금액을 증가 제품 선택 가능 제품 선택하면 동전 없음이면 아무 동작 동전 없음 유지 하지 않음 제품 선택하면 제품 선택 가능이면 제품 주고 잒액 있으면 제품 선택 가능 잒액 감소 잒액 없으면 동전 없음
  • 3. 조건 문을 이용한 구현 class VendingMachine { final int NOCOIN = 1; final int SELECTABLE = 2; insertCoin(int coin) { if (state == NOCOIN) { increaseCoin(coin); 세척 중인 경우와 state = SELECTABLE; } else if (state == SELECTABLE) { 품절인 경우도 increaseCoint(coin); 처리해야 한다… } } select(int productId) { if (state == NOCOIN) { doNothing(); } else if (state == SELECTABLE) { provideProduct(productId); decreaseCoin(); if (isNoCoin()) { state = NOCOIN; } } }
  • 4. 새로운 조건 추가 class VendingMachine { final int NOCOIN = 1; final int SELECTABLE = 2; final int CLEANING = 3; if-else 때문에 final int SOLDOUT = 4; 코드가 복잡해 질 것 같은 불길한 냄새가 남 insertCoin(int coin) { if (state == NOCOIN) { increaseCoin(coin); state = SELECTABLE; } else if (state == SELECTABLE) { increaseCoint(coin); } else if (state == CLEANING) { returnCoin(); } else if (state == SOLDOUT) { returnCoin(); } } … }
  • 5. 처리 방식을 한번 더 생각해보면 class VendingMachine { final int NOCOIN = 1; final int SELECTABLE = 2; final int CLEANING = 3; final int SOLDOUT = 4; 상태에 따라 insertCoin(int coin) { 동일한 요청의 상태에 의존하는 if (state == NOCOIN) { 처리가 바뀜 조건절이 많음 increaseCoin(coin); state = SELECTABLE; } else if (state == SELECTABLE) { increaseCoint(coin); } else if (state == CLEANING) { returnCoin(); } else if (state == SOLDOUT) { returnCoin(); } } … }
  • 6. State 패턴은 언제? 상태에 따라서 동일한 요청을 다르게 처리해 주어야 할 때
  • 7. State 패턴의 구조 State Context Concrete State
  • 8. Context • 클라이언트가 필요한 기능(인터페이스) 제공 • 내부적으로 State에 요청 처리 위임 class VendingMachine { VendingMachine private State state; -state : State public void insertCoin(int coin) { +insertCoin(coin : int) state.insertCoint(coin, this); } +selectProduct(productId : int) +chageState(state : State) public void selectProduct(int productId) { state.selectProduct(productId, this); } public void changeState(sState newState) { this.state = newState; } }
  • 9. State & Concrete State • State – 모든 상태에 공통된 기능 처리를 정의 • Concrete State - 특정 상태의 기능 처리를 구현 class NoCoinState implements State { public void insertCoin(int coin, VendingMachine machine) { // 동전 증가 machine.changeState(selectableState); } public void selectProduct( int productId, VendingMachine machine) { beep(); } }
  • 10. 패턴 적용 후, 조건 문 → 여러 State class VendingMachine { final int NOCOIN = 1; NoCoinState final int SELECTABLE = 2; final int CLEANING = 3; final int SOLDOUT = 4; insertCoin(int coin) { SelectableState if (state == NOCOIN) { increaseCoin(coin); state = SELECTABLE; } else if (state == SELECTABLE) { increaseCoint(coin); CleaingState } else if (state == CLEANING) { returnCoin(); } else if (state == SOLDOUT) { returnCoin(); } SoldOutState } … }
  • 11. 구현 이슈 1 - State의 전이는 누가 • 안1, State에서 상태 전이 처리 class ConcreteState implements State { public void behavior1(int coin, Context context) { // do something context.changeState(nextState); } } – State 구현 클래스 갂 커플링 발생 NoCoinState SelectableState CleaningState • 안2, Context에서 상태 전이 처리 – Context의 코드가 다소 복잡해짐
  • 12. 구현 이슈 2 - 테이블 기반 구현 • 상태 전이를 표로 표현 현재 상태 입력 값 다음 상태 A 1 B A 2 C C 1 Z • State 패턴과의 차이점 – 테이블 기반 구현 - 상태의 전이에 초점 – State 패턴 구현 - 상태에 특화된 기능 제공에 초점
  • 13. State 패턴 정리 • 상태에 특정한 기능의 처리 구현을 여러 클래스 에 분산 – 새로운 상태 추가 용이 • 새로운 State 구현 클래스 추가로 상태 추가 가능 – 긴 조건문을 피할 수 있음 – 클래스가 많아짐 • 상태 전이가 명시적 – 상태 관련 코드가 구조화 됨 – 코드의 구조나 의도를 명확하게 함