본문 바로가기
CS(Computer Science)지식/[C++] 디자인 패턴

해석자 패턴(Interpreter Pattern) 이해하기 : 쉽게 설명한 디자인 패턴(C++)

by 엔지니어 청년 2024. 1. 29.

해석자 패턴(Interpreter Pattern)이란?


해석자 패턴은 주어진 언어의 문법을 위한 표현을 정의하고, 이 언어로 작성된 문장을 해석하는 해석자를 사용하는 디자인 패턴입니다. 이 패턴은 주로 문법 트리를 구성하고 이를 통해 문장을 해석하는 데 사용됩니다.

해석자 패턴은 다음과 같은 경우에 유용합니다:

  • 복잡한 문법을 가진 언어를 해석해야 하는 경우
  • 문법 트리를 구성하고 이를 통해 문장을 해석해야 하는 경우

예시 코드


다음은 C++로 작성된 간단한 해석자 패턴의 예입니다:

#include <iostream>
#include <string>

// Abstract Expression
class AbstractExpression {
public:
    virtual ~AbstractExpression() = default;
    virtual void interpret(const std::string& context) = 0;
};

// Terminal Expression
class TerminalExpression : public AbstractExpression {
public:
    void interpret(const std::string& context) override {
        std::cout << "Terminal expression for " << context << std::endl;
    }
};

// Nonterminal Expression
class NonterminalExpression : public AbstractExpression {
public:
    void interpret(const std::string& context) override {
        std::cout << "Nonterminal expression for " << context << std::endl;
    }
};

int main() {
    TerminalExpression terminalExpression;
    NonterminalExpression nonterminalExpression;

    terminalExpression.interpret("Hello");  // Output: Terminal expression for Hello
    nonterminalExpression.interpret("World");  // Output: Nonterminal expression for World

    return 0;
}

위 코드에서 AbstractExpression은 모든 표현식이 구현해야 하는 인터페이스입니다. TerminalExpressionNonterminalExpressionAbstractExpression 인터페이스를 구현하는 구체적인 표현식입니다.

클래스 다이어그램


    +-----------------+
    | AbstractExpression |
    +-----------------+
    | virtual ~AbstractExpression|
    | virtual interpret |
    +-----------------+
            ^
            |
    +-----------------+     +-----------------+
    | TerminalExpression |  | NonterminalExpression |
    +-----------------+     +-----------------+
    | interpret       |     | interpret       |
    +-----------------+     +-----------------+

해석자 패턴은 복잡한 문법을 가진 언어를 해석하는 데 유용하며, 문법 트리를 구성하고 이를 통해 문장을 해석하는 데 사용됩니다