Design Pattern

[디자인 패턴] 인터프리터 패턴 (Interpreter Pattern)

꾸준함. 2024. 6. 30. 07:15

인터프리터 패턴

  • 언어의 문법을 정의하는 클래스를 이용하여 해당 언어의 문장을 해석하고 평가하는 디자인 패턴
  • 문법이 복잡하거나 자주 변경되지 않는 경우 유용
  • 반복되는 문제 패턴을 언어 또는 문법으로 정의하고 확장 가능
  • 주로 컴파일러나 스크립트 언어 인터프리터에서 사용됨

 

https://reactiveprogramming.io/blog/en/design-patterns/interpreter

 

주요 구성 요소

 

1. AbstractExpression

  • 인터프리터에 의해 해석되는 공통 인터페이스 혹은 추상 클래스
  • 주로 interpret 메서드를 포함하며, 이 메서드는 특정 문법 규칙을 해석하는 역할

 

2. TerminalExpression

  • 문법의 기초 요소를 구현하는 클래스
  • 주로 숫자, 변수, 상수와 같은 기초적인 값들을 해석하는 역할

 

3. NonTerminalExpression

  • 문법의 복합 요소를 구현하는 클래스
  • 터미널 표현과 다른 비터미널 표현을 조합하여 더 복잡한 문법 규칙을 표현

 

4. Context

  • 해석이 이루어지는 환경을 나타내며, 해석에 필요한 정보를 저장하고 관리
  • 문자열 표현식이나 변수 값을 저장하고, 필요한 메서드를 제공
  • Context 클래스는 보통 표현식 해석에 필요한 데이터를 포함하며, 해석 과정을 추적하거나 보조하는 역할

 

5. Client

  • 문장을 구성하고 해석을 시작하는 역할

 

인터프리터 패턴 구현 예시

  • 간단한 수학 표현식을 해석하는 인터프리터 패턴 구현 예시
    • 간단한 예시이므로 두 개의 integer 숫자에 대한 하나의 연산만 지원

 

1. AbstractExpression


 

2. TerminalExpression


 

3. NonTerminalExpression


 

4. Context


 

5. 클라이언트 코드

 

 

인터프리터 패턴 장단점

 

장점

  • 자주 등장하는 문제 패턴을 언어와 문법으로 정의 가능
  • 기존 코드를 변경하지 않고 새로운 Expression을 추가할 수 있음 ( SOLID의 OCP 원칙)

 

단점

  • 복잡한 문법을 표현하기 위해서는 Expression과 Context가 복잡해질 수밖에 없음
    • 큰 인터프리터 시스템의 유지 보수는 어렵고 비용이 많이 듦

 

실무에서 쓰이는 인터프리터 패턴

 

1. 자바 컴파일러

  • 인터프리터 패턴은 언어의 구문을 정의하고 해석하는 데 중점을 두기 때문에, 자바 컴파일러의 문법 해석 단계와 밀접한 관련이 있음
  • 자바 컴파일러가 인터프리터 패턴을 어떻게 활용할 수 있는지 정리하면 다음과 같음
    • 어휘 분석 단계에서 소스 코드를 토큰으로 분해하고, 각 토큰을 TerminalExpression으로 처리
    • 구문 분석 단계에서 토큰을 추상 구문 트리(AST)로 변환하고, 이 과정에서 NonTerminalExpression을 사용하여 복합 구문 구조를 구성
    • 의미 분석 단계에서 AST를 해석하고, 각 표현식 노드의 interpret 또는 evaluate 메서드를 호출하여 프로그램의 의미를 해석하고 컴파일

 

2. 스프링의 SpEL (Spring Expression Language)

  • Spring 프레임워크에서 제공하는 강력한 표현 언어로, 런타임 시점에 객체 그래프를 탐색하고 조작할 수 있는 기능을 제공

 

SpEL 구성 요소

 

1. AbstractExpression

  • SpEL의 모든 표현식은 org.springframework.expression.Expression 인터페이스를 구현


 

2. TerminalExpression

  • 터미널 표현 클래스는 리터럴, 변수 참조 등 단순한 표현식 요소를 처리
  • ex) LiteralExpression, VariableReference

 

LiteralExpression

 

3. NonTerminalExpression

  • 비터미널 표현 클래스는 연산자, 메서드 호출 등 복합적인 표현식 요소를 처리
  • ex) Operator, MethodReference

 

MethodReference

 

4. Context

  • SpEL의 EvaluationContext는 표현식 평가에 필요한 환경을 제공
  • 변수와 함수를 설정하고, 표현식 평가 시 이를 사용
  • ex) StandardEvaluationContext

 

5. Client

  • SpelExpressionParser는 SpEL 표현식을 파싱하고 Expression 객체로 변환

 

참고

코딩으로 학습하는 GoF의 디자인 패턴 - 백기선 강사님

반응형