인터프리터 패턴
- 언어의 문법을 정의하는 클래스를 이용하여 해당 언어의 문장을 해석하고 평가하는 디자인 패턴
- 문법이 복잡하거나 자주 변경되지 않는 경우 유용
- 반복되는 문제 패턴을 언어 또는 문법으로 정의하고 확장 가능
- 주로 컴파일러나 스크립트 언어 인터프리터에서 사용됨
주요 구성 요소
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
3. NonTerminalExpression
- 비터미널 표현 클래스는 연산자, 메서드 호출 등 복합적인 표현식 요소를 처리
- ex) Operator, MethodReference
4. Context
- SpEL의 EvaluationContext는 표현식 평가에 필요한 환경을 제공
- 변수와 함수를 설정하고, 표현식 평가 시 이를 사용
- ex) StandardEvaluationContext
5. Client
- SpelExpressionParser는 SpEL 표현식을 파싱하고 Expression 객체로 변환
참고
코딩으로 학습하는 GoF의 디자인 패턴 - 백기선 강사님
반응형
'Design Pattern' 카테고리의 다른 글
[디자인 패턴] 커맨드 패턴 (Command Pattern) (0) | 2024.06.30 |
---|---|
[디자인 패턴] 이터레이터 패턴 (Iterator Pattern) (0) | 2024.06.30 |
[디자인 패턴] 중재자 패턴 (Mediator Pattern) (0) | 2024.06.30 |
[디자인 패턴] 책임 연쇄 패턴 (Chain-of-Responsibility Pattern) (0) | 2024.06.29 |
[디자인 패턴] 프록시 패턴 (Proxy Pattern) (0) | 2024.06.29 |