Interpreter

인터프리터 패턴은 주어진 언어(또는 표현식)를 해석하는 규칙을 클래스로 표현하여, 해당 언어의 문법을 해석하고 실행할 수 있도록 하는 디자인 패턴입니다.

          +--------------------------+
          |      Expression          |  <-- 인터프리터 인터페이스
          +--------------------------+
          | + interpret(context)     |
          +--------------------------+

        ┌────────────┴────────────┐
        │                         │
+-------------------+    +-------------------------+
| TerminalExpression|    | NonTerminalExpression   |
|   (숫자, 변수 등)  |    |  (연산자 등 복합 표현)    |
+-------------------+    +-------------------------+
| + interpret()     |    | + interpret()           |
+-------------------+    +-------------------------+

표현식(문법 규칙)을 캡슐화한 객체들(TerminalExpression, NonTerminalExpression)을 사용하여 복잡한 언어를 파싱하고 해석할 수 있습니다.

  • 타겟(Target): 클라이언트가 사용하는 인터페이스입니다.

  • 어댑티(Adaptee): 기존에 존재하는, 원하는 인터페이스와 다른 인터페이스를 가진 클래스입니다.

  • 어댑터(Adapter): 어댑티의 인터페이스를 타겟 인터페이스로 변환하는 클래스입니다.


How do code

import java.util.Map;

// Expression 인터페이스: 해석 메서드를 정의
public interface Expression {
    int interpret(Map<String, Integer> context);
}

// TerminalExpression: 숫자와 변수 등의 터미널 표현식을 구현
public class NumberExpression implements Expression {
    private int number;

    public NumberExpression(int number) {
        this.number = number;
    }

    @Override
    public int interpret(Map<String, Integer> context) {
        return number;
    }
}

// NonTerminalExpression: 두 Expression을 더하는 덧셈 표현식을 구현
public class AddExpression implements Expression {
    private Expression leftExpression;
    private Expression rightExpression;

    public AddExpression(Expression left, Expression right) {
        this.leftExpression = left;
        this.rightExpression = right;
    }

    @Override
    public int interpret(Map<String, Integer> context) {
        // 왼쪽과 오른쪽 표현식을 해석하여 결과를 더함
        return leftExpression.interpret(context) + rightExpression.interpret(context);
    }
}
  • Expression 인터페이스: 모든 해석 대상(문법 요소)이 구현해야 하는 인터페이스로, interpret() 메서드를 통해 해석 결과를 반환합니다.

  • TerminalExpression (NumberExpression): 숫자나 변수와 같이 더 이상 분해할 수 없는 기본 요소를 표현합니다. 이 예제에서는 숫자 값을 단순히 반환합니다.

  • NonTerminalExpression (AddExpression): 두 개의 Expression 객체를 결합하여 연산(여기서는 덧셈)을 수행합니다. 내부적으로 왼쪽과 오른쪽 Expression을 해석하여 결과를 결합합니다.

  • Context: 해석 시 필요한 외부 정보를 담은 객체(여기서는 변수 값 등)를 의미합니다. 예제에서는 사용하지 않았지만, 복잡한 언어를 해석할 때 변수 매핑 등을 위해 사용됩니다.

Last updated