인터프리터 interpreter 패턴 - 타입스크립트 예시

SW설계
읽는데 3분 소요
처음 쓰여진 날: 2025-09-01
마지막 수정일: 2025-09-01

요약

인터프리터 interpreter 패턴을 타입스크립트 코드와 함께 알아봅니다.

인터프리터 (Interpreter) 패턴 요약

패턴 종류핵심 키워드
인터프리터 (Interpreter)특정 언어 문법 정의, 그 문법으로 작성된 문장을 해석
인터프리터 패턴 감자
인터프리터 패턴 감자

인터프리터 (Interpreter) 패턴

인터프리터 패턴은 특정 언어의 문법을 정의하고, 그 문법으로 작성된 문장을 해석하는 해석기(Interpreter)를 만드는 패턴입니다. 간단한 언어(DSL, Domain-Specific Language)를 만들고 그 언어의 구문을 해석해야 할 때 사용됩니다.

가장 대표적인 예시는 '계산기'나 '정규표현식' 입니다. 3 + 5 - 2 라는 텍스트가 있을 때, 우리는 이를 숫자(Terminal Expression)와 연산자(Non-terminal Expression)로 나누어 해석하고, 정해진 문법 규칙(우선순위 등)에 따라 최종 결과인 6을 도출합니다. 인터프리터 패턴은 이처럼 문법 규칙을 클래스로 표현하여 문장을 해석하는 구조를 제공합니다.

기본 구조

  • AbstractExpression: 모든 표현식(터미널, 논터미널)이 구현해야 할 공통 인터페이스입니다. 보통 interpret() 메서드를 정의합니다.
  • TerminalExpression: 문법의 최소 단위(종단 표현식)를 나타냅니다. 예를 들어, 변수나 숫자 같은 것들입니다.
  • NonterminalExpression: 문법 규칙을 나타냅니다. 다른 표현식들을 자식으로 가질 수 있으며, 이들을 조합하여 새로운 결과를 만들어냅니다. (예: 덧셈 표현식, 뺄셈 표현식)
  • Context: 인터프리터가 문장을 해석하는 데 필요한 전역 정보(예: 변수의 값)를 담고 있습니다.
  • Client: 해석할 문장을 만들고, 파싱하여 인터프리터에게 전달하는 역할을 합니다.

예시: 간단한 덧셈/뺄셈 계산기

x + y - z 와 같은 간단한 수식을 해석하는 계산기를 만들어 보겠습니다.

typescript
// Context
const context = { x: 10, y: 5, z: 2 };

// AbstractExpression
interface Expression {
  interpret(context: { [key: string]: number }): number;
}

// TerminalExpression
class NumberExpression implements Expression {
  constructor(private variable: string) {}

  interpret(context: { [key: string]: number }): number {
    return context[this.variable];
  }
}

// NonterminalExpression
class AddExpression implements Expression {
  constructor(private left: Expression, private right: Expression) {}

  interpret(context: { [key: string]: number }): number {
    return this.left.interpret(context) + this.right.interpret(context);
  }
}

class SubtractExpression implements Expression {
  constructor(private left: Expression, private right: Expression) {}

  interpret(context: { [key: string]: number }): number {
    return this.left.interpret(context) - this.right.interpret(context);
  }
}

// 클라이언트 코드
// 목표: x + y - z 를 해석하기
const x = new NumberExpression("x");
const y = new NumberExpression("y");
const z = new NumberExpression("z");

// 1. x + y
const sum = new AddExpression(x, y);

// 2. (x + y) - z
const resultExpression = new SubtractExpression(sum, z);

// 최종 해석
const result = resultExpression.interpret(context);
console.log(`x + y - z = ${result}`); // 10 + 5 - 2 = 13
// 출력: x + y - z = 13

resultExpressionnew SubtractExpression(new AddExpression(new NumberExpression("x"), new NumberExpression("y")), new NumberExpression("z")) 와 같은 트리 구조를 형성합니다. interpret 메서드를 호출하면, 이 트리를 후위 순회(post-order traversal)하며 최종 결과가 계산됩니다.

인터프리터 패턴 중요 키워드

  • 간단한 언어의 문법을 클래스 계층으로 표현합니다.
  • 문장을 AST(추상 구문 트리, Abstract Syntax Tree) 로 구성하여 해석합니다.
  • 문법이 단순하고 자주 변하지 않을 때 유용합니다.
  • 문법이 복잡해지면 클래스 계층이 매우 방대해지고 관리하기 어려워지는 단점이 있습니다.
문제
특정 언어의 문법을 정의하고, 그 문법으로 작성된 문장을 해석하는 해석기를 만드는 패턴으로 간단한 언어의 문법을 클래스 계층으로 표현하고, 문장을 AST(추상 구문 트리)로 구성하여 해석하는 디자인 패턴은?
보기
답변
정답정답 보기