인터프리터 interpreter 패턴 - 타입스크립트 예시
SW설계
읽는데 3분 소요
처음 쓰여진 날: 2025-09-01
마지막 수정일: 2025-09-01
조회수: 27
요약
인터프리터 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
resultExpression
은 new SubtractExpression(new AddExpression(new NumberExpression("x"), new NumberExpression("y")), new NumberExpression("z"))
와 같은 트리 구조를 형성합니다. interpret
메서드를 호출하면, 이 트리를 후위 순회(post-order traversal)하며 최종 결과가 계산됩니다.
인터프리터 패턴 중요 키워드
- 간단한 언어의 문법을 클래스 계층으로 표현합니다.
- 문장을 AST(추상 구문 트리, Abstract Syntax Tree) 로 구성하여 해석합니다.
- 문법이 단순하고 자주 변하지 않을 때 유용합니다.
- 문법이 복잡해지면 클래스 계층이 매우 방대해지고 관리하기 어려워지는 단점이 있습니다.
문제 | 특정 언어의 문법을 정의하고, 그 문법으로 작성된 문장을 해석하는 해석기를 만드는 패턴으로 간단한 언어의 문법을 클래스 계층으로 표현하고, 문장을 AST(추상 구문 트리)로 구성하여 해석하는 디자인 패턴은? |
보기 | |
답변 | |
정답 | 정답 보기 |