[python] 인터프리터 패턴

인터프리터 패턴은 특정 언어 및 문법을 해석하고 실행하기 위한 설계 패턴입니다. 이 패턴은 문법 규칙을 표현하는 클래스들과 해당 클래스들을 통해 문장을 해석하고 실행하는 인터프리터 클래스로 구성됩니다. 인터프리터 패턴은 주로 프로그래밍 언어 해석기나 수식 계산기 등에서 사용됩니다.

동작 방식

인터프리터 패턴은 다음과 같은 구성 요소로 이루어집니다:

  1. AbstractExpression (추상 표현식): 문법 규칙에 대한 추상 클래스이며 interpret라는 추상 메서드를 정의합니다.
  2. TerminalExpression (종단 표현식): 실제 표현식을 해석하고 실행하는데 사용되는 클래스입니다.
  3. NonterminalExpression (비종단 표현식): 하나 이상의 종단 표현식을 조합하여 복잡한 표현식을 나타내는 클래스입니다.
  4. Context (문맥): 해석되는 표현식에 대한 정보를 제공합니다.

인터프리터 패턴은 다음과 같은 순서로 동작합니다:

  1. 클라이언트는 문장을 인터프리터 객체에 전달합니다.
  2. 인터프리터 객체는 해당 문장을 구문 분석하고 표현식 객체를 생성합니다.
  3. 생성된 표현식 객체는 문장을 해석하고 실행하기 위해 interpret 메서드를 호출합니다.
  4. 해석된 문장의 결과가 반환되고 클라이언트는 이를 사용할 수 있습니다.

예제 코드

다음은 파이썬으로 구현된 인터프리터 패턴의 예제 코드입니다:

from abc import ABC, abstractmethod

class Expression(ABC):
    @abstractmethod
    def interpret(self, context):
        pass

class TerminalExpression(Expression):
    def __init__(self, value):
        self.value = value

    def interpret(self, context):
        return context.get(self.value)

class NonterminalExpression(Expression):
    def __init__(self, expression1, expression2):
        self.expression1 = expression1
        self.expression2 = expression2

    def interpret(self, context):
        # 특정 연산을 수행하여 결과를 반환하는 예시 코드입니다
        return self.expression1.interpret(context) + self.expression2.interpret(context)

# 문장을 해석해주는 인터프리터 클래스입니다
class Interpreter:
    def __init__(self, expression):
        self.expression = expression

    def interpret(self, context):
        return self.expression.interpret(context)

# 클라이언트 코드
context = {"x": 5, "y": 10}
expression = NonterminalExpression(TerminalExpression("x"), TerminalExpression("y"))

interpreter = Interpreter(expression)
result = interpreter.interpret(context)
print(result)  # 출력 결과: 15

위의 코드는 “x + y”라는 문장을 해석하고 실행하는 간단한 예제입니다. TerminalExpression 클래스는 변수 값을 찾아오는 역할을 하고, NonterminalExpression 클래스는 두 개의 표현식을 더하는 연산을 정의합니다. Interpreter 클래스는 문장을 해석하여 결과를 반환합니다.

결론

인터프리터 패턴은 특정 언어나 문법을 해석하고 실행하기 위한 유용한 설계 패턴입니다. 이 패턴을 사용하면 복잡한 문장을 구문 분석하고 실행할 수 있으며, 프로그래밍 언어 해석기나 수식 계산기 등에 적용할 수 있습니다.