일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- akka 강좌
- 하이브리드앱
- Hyperledger fabric gossip protocol
- 이더리움
- 파이썬
- 하이퍼레저 패브릭
- 파이썬 머신러닝
- Actor
- Play2 로 웹 개발
- CORDA
- 파이썬 강좌
- 스위프트
- 파이썬 데이터분석
- 파이썬 동시성
- 블록체인
- 스칼라 강좌
- Adapter 패턴
- 플레이프레임워크
- 주키퍼
- Golang
- Akka
- 스칼라 동시성
- 안드로이드 웹뷰
- Play2
- 엔터프라이즈 블록체인
- play2 강좌
- 그라파나
- 스칼라
- play 강좌
- hyperledger fabric
- Today
- Total
HAMA 블로그
Interpreter 패턴 본문
GOF 의 디자인패턴중 하나인 인터프리터 패턴에 대해서 살펴보도록 하자.
인터프리터 패턴은 모든 종류의 GoF 패턴들 중에 가장 어렵다. 물론 인터프리터 자체를 만드는게 어렵
기때문에 덩달아 어렵다는 이야기이고, 모습 자체는 여느 디자인패턴과 비슷하다.
원래 디자인패턴이라는건 사실 모양은 다 비슷비슷하다. 그게 쓰여지는 의도에 따라서 패턴의 구분이
이루어진다. 인터프리터 패턴은 느낌 그대로 어떤 해석기, 즉 "간이언어" 를 만들기 위한 패턴이다.
예를들어 클라이언트-서버 프로그램을 만들때 , 프로토콜로 "사람이 자연스럽게 읽을수 있는 문법형태"
로 하자!! 라고 정할수있는데, 그때 사용하면 되겠다. 프로토콜 예로는 "Select * From Table" 이렇게~
자 이 글에서는
"program repeat 3 go right end end" 라는 문장을 해석해서 실행하는 프로그램을 예로 들어 설명해보겠다.
"자바언어로 배우는 디자인 패턴 입문" 이라는 책을 참고했다.
일단 저 문장에 대해서 BNF 라고 하는 언어의 문법을 표기할때 사용되는 표기법으로 분석해보자.
<program> ::= program <command list>
<command list> ::= <command>* end
<command> ::= <repeat command> | <primitive command>
<repeat command> ::= repeat <number> <command list>
<primitive command>::= go | right | left
사실 저 BNF 를 만드는게 가장 어렵다고 볼수있다.
만약 SQL 을 저런식으로 만든다고 상상해보자.
statement ::= INSERT INTO INDENTIFIER [LP idList RP] VALUES LP exprList RP
| CREATE DATABASE IDENTIFIER
| CREATE TABLE IDENTIFIER LP declarations RP
| DROP TABLE IDENTIFIER
| BEGIN | WORK | TRAN[SACTION]]
| COMMIT | WORK | TRAN[SACTION]]
| ROLLBACK [WORK | TRAN[SACTION]]
| DUMP
| USE DATABASE IDENTIFIER
| UPDATE IDENTIFIER SET IDENTIFIER EQUAL expr WHERE expr
| DELETE FROM IDENTIFIER WHERE expr
| SELECT [INTO identifier idList FROM idList [WHERE expr]
...
등등 무수히 많은 정의가 추가될것이다.
돌아가서 첫번째 BNF 를 토대로 클래스 다이어그램을 만들어보자.
위 클래스 다이어그램에
"program repeat 3 go right end end" 를 파싱해서 객체트리를 만들어보자. 이 객체트리를 구문트리
라고 한다. 객체트리를 만드는 방법은 문장을 토큰화하여 한 단어씩 분석하면서 진행된다. 처음에
program 객체를 만들고, 해당 객체가 가지고 있을수있는 CommandListNode 객체를 만들고
CommandListNode 는 CommandNode 객체(들)를 만들고 (이때 Repeat / Primitive 선택) 이런식으로~
Primitive 는 go 라는 명령어를 가지고있게되고,나중에 순회하면서 go 에 해당하는 행동을 하게함.
만들어진 구문 트리 시작 객체의 Execute 함수를 실행하면 구문트리를 순회하게 된다.
자동차를 저 문장을 가지고 실행하게된다면 앞으로(go) 갔다가 오른쪽(right)으로 도는 행동을
3번 연속하게된다. 만약 SQL 문으로 저런 구문트리를 만들었다고 가정하면 , 2차배열의 테이블을
구문트리 객체에 파라미터로 넘기면 , 구문트리를 돌면서 해당 객체의 수행방법에 따라서
해당 테이블에서 특정 데이터만 뽑아낼수있을것이다.
'디자인패턴' 카테고리의 다른 글
JDBC 와 디자인패턴 - 5. Adapter 패턴 (0) | 2015.08.16 |
---|---|
JDBC 와 디자인패턴 - 4. chain of Responsibility 패턴 (0) | 2015.08.14 |
JDBC 와 디자인패턴 - 3. State 패턴 (0) | 2015.07.30 |
JDBC 와 디자인패턴 - 1.소개 및 2. Abstract Factory 패턴 (0) | 2015.07.28 |
Actor 모델 과 ActiveObject 패턴의 차이 (0) | 2015.05.17 |