본문 바로가기

Design/Design Pattern

[Design Pattern] Interpreter Pattern

이번 장에서는 인터프리터(Interpreter) 패턴에 대해서 알아본다.
샘플 코드는 여기 (링크)의 프로젝트의 테스트 코드로 정리해두었다.


인터프리터 패턴이란?
위키백과에 따른 정의는 아래와 같다.

한 언어에서 문자열을 평가하는 방법을 규정하는 디자인 패턴.
기본 개념은 특화된 컴퓨터 언어에서 각 기호(종단 또는 비종단)마다 클래스를 갖는 것이다.
언어 내 한 문자열의 구문 트리는 컴포지트 패턴의 인스턴스이며 클라이언트의 문자열을 평가(해석)하기 위해 사용된다.

(문이라고 작성되어 있는 부분만 이해를 돕기위해 문자열로 수정하였음)
쉽게 말해서 문자열을 해석하는 클래스를 만들어서 각 클래스들이 문자열을 평가 및 해석하는 디자인 패턴이다.

이번에는 주관식 답안지를 평가하는 프로그램을 예시로 진행해본다.
주관식 답안지에 통과에 필요한 문구들이 절반이상 포함되어 있다면 "Grate"
모든 문구들이 포함되어 있다면 "Excellent"이라고 가정한다.


GoF Design Patterns에 따르면 아래와 같은 Class Diagram이 그려진다.

Context: Expression들에 의해 평가될 문자열
AbstractExpression: Expression들의 추상 클래스로 이를 구현하는 모든 Expression들이 구현해야하는 interpret 메서드를 정의하고 있다.
TerminalExpression: Context에 대한 평가가 종료되는 Expression.
NonTerminalExpression: 다른 Expression들을 재귀적으로 호출하는 Expression이다.

위의 그림을 주관식 답안지(Answer)와 이를 채점하는 채점자(Scorer)에 적용시키면 아래와 같은 그림이 그려진다.

Answer: 채점자(Scorer)들에게 평가될 답안.
Scorer: 답안의 평가를 진행할 구현체들이 구현해야하는 추상 클래스
TerminalScorer: 답안에 대한 평가를 종료시키는 Expression.
GrateScorer: 답안이 Grate인지 평가하는 Expression.
ExcellentScorer: 답안이 Excellent인지 평가하는 Expression.


코드를 보면서 하나씩 살펴보도록 한다.

Scorer Interface
채점자들이 구현해야하는 interpret 메서드를 정의하고 있는 인터페이스

TerminalScorer
정답을 가지고 있는 채점자이며 답안이 정답을 포함하고 있는지 확인한다

GrateScorer
TerminalScorer을 가지고 있으며 답안이 TerminalScorer을 통한 채점 결과가 50%가 넘는 경우 Grate 등급으로 판단한다.

ExcellentScorer
TerminalScorer을 가지고 있으며 답안이 모든 TerminalScorer의 채점을 통과해야지만 Excellent 등급으로 판단한다.

Client
답안에 있어야하는 항목(TerminalScorer)을 정의하며 답안들의 결과를 확인하는 클래스.
예를들어 1번 답안인 "바나나는 과일입니다." 는 scorers에 어떠한 항목에도 포함되지 않으므로 Grate도 Excellent도 될 수 없다.
2번 답안인 "자바와 코틀린은 프로그래밍 언어입니다."는 자바, 코틀린, 프로그래밍, 언어 총 네개의 항목이 일치했으므로
Grate 등급을 받을 수 있다. 하지만 구글을 포함하지 못했으므로 Excellent는 될 수 없다.

코드를 실행시킨 결과는 아래와 같다.


지금까지 답안과 답안을 평가하는 채점자를 인터프리터 패턴에 적용해서 알아보았다.

'Design > Design Pattern' 카테고리의 다른 글

[Design Pattern] 정리  (0) 2022.02.08
[Design Pattern] Proxy Pattern  (0) 2022.02.06
[Design Pattern] Command Pattern  (0) 2022.02.06
[Design Pattern] Iterator Pattern  (0) 2022.02.04
[Design Pattern] Flyweight Pattern  (0) 2022.02.04