-
행위 패턴(Behavioral Pattern) - 인터프리터(Interpreter) 패턴Java/디자인패턴 2024. 11. 27. 10:29반응형
인터프리터(Interpreter) 패턴은 행위 패턴(Behavioral Pattern) 중 하나로, 주로 언어나 문법을 처리하는 데 사용됩니다. 이 패턴은 언어의 문법을 표현하는 클래스를 정의하고, 그 문법에 맞는 문장을 해석(interpret)하는 방법을 제공합니다. 주로 컴파일러나 스크립트 언어의 구문 분석기 구현에 사용됩니다.
1. 인터프리터 패턴의 목적
인터프리터 패턴의 목적은 주어진 언어나 표현식의 문법을 해석할 수 있는 클래스를 정의하고, 문법에 맞는 입력을 처리할 수 있도록 하는 것입니다. 이를 통해 다양한 표현식을 객체로 모델링하고, 해당 표현식을 처리하는 방법을 구현할 수 있습니다.
2. 인터프리터 패턴의 구성 요소
- Context: 해석할 문법을 포함하는 입력 데이터를 제공합니다.
- AbstractExpression: 인터프리터가 문법을 해석하는데 사용하는 인터페이스입니다. 보통 interpret() 메서드를 통해 해석을 수행합니다.
- TerminalExpression: 더 이상 분해할 수 없는 문법 요소를 처리하는 구체적인 표현식입니다. 예를 들어, 리터럴 값이나 가장 간단한 토큰입니다.
- NonTerminalExpression: 다른 표현식(터미널 또는 비터미널 표현식)을 포함하는 표현식입니다. 이들은 다른 표현식의 해석을 조합합니다.
- Interpreter: 문법을 해석하고 결과를 도출하는 역할을 합니다.
3. 인터프리터 패턴의 예제 (Java)
예를 들어, +와 - 연산을 처리하는 간단한 계산기를 만들어보겠습니다. 이 계산기는 문자열로 표현된 수식을 해석하여 결과를 계산합니다.
코드 예제
// AbstractExpression 인터페이스 interface Expression { int interpret(); } // TerminalExpression: 숫자 표현식 class NumberExpression implements Expression { private int number; public NumberExpression(int number) { this.number = number; } @Override public int interpret() { return number; } } // NonTerminalExpression: 덧셈 표현식 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() { return leftExpression.interpret() + rightExpression.interpret(); } } // NonTerminalExpression: 뺄셈 표현식 class SubtractExpression implements Expression { private Expression leftExpression; private Expression rightExpression; public SubtractExpression(Expression left, Expression right) { this.leftExpression = left; this.rightExpression = right; } @Override public int interpret() { return leftExpression.interpret() - rightExpression.interpret(); } } // 클라이언트 코드 public class InterpreterPatternExample { public static void main(String[] args) { // 수식: (5 + 3) - 2 Expression five = new NumberExpression(5); Expression three = new NumberExpression(3); Expression two = new NumberExpression(2); Expression add = new AddExpression(five, three); // 5 + 3 Expression subtract = new SubtractExpression(add, two); // (5 + 3) - 2 // 해석 결과 출력 System.out.println("결과: " + subtract.interpret()); // 결과: 6 } }
코드 설명
- Expression 인터페이스는 문법을 해석할 수 있는 interpret() 메서드를 정의합니다.
- NumberExpression은 리터럴 숫자를 처리하는 터미널 표현식으로, 숫자 값을 그대로 반환합니다.
- AddExpression과 SubtractExpression은 각각 덧셈과 뺄셈을 처리하는 비터미널 표현식입니다. 각각 두 개의 표현식을 받아서 결과를 계산합니다.
- 클라이언트 코드에서는 (5 + 3) - 2라는 수식을 표현식을 사용해 해석하고 결과를 출력합니다.
4. 인터프리터 패턴의 장점과 단점
장점
- 문법의 규칙을 객체로 표현하여 확장하기 용이합니다.
- 특정 언어나 수식의 해석 로직을 쉽게 구현하고, 그 로직을 모듈화할 수 있습니다.
- 새로운 문법을 추가하는 것이 비교적 간단합니다.
단점
- 문법이 복잡해질수록 클래스가 많아지고, 코드가 복잡해질 수 있습니다.
- 작은 문법을 처리할 때는 오히려 과도한 설계가 될 수 있습니다.
- 비효율적인 해석을 초래할 수 있으며, 특히 문법이 깊고 복잡한 경우 성능 문제가 발생할 수 있습니다.
5. 인터프리터 패턴의 사용 예시
- 수식 해석기: 계산기, 수학 표현식 해석기 등.
- 프로그래밍 언어의 구문 분석: 컴파일러나 인터프리터 구현.
- 정규 표현식 엔진: 정규 표현식 문법을 해석하고 매칭하는 시스템.
반응형'Java > 디자인패턴' 카테고리의 다른 글
구조(Structural) 패턴 - 복합체(Composite) 패턴 (0) 2024.11.26 패턴은 행동(Behavioral) - 책임 연쇄(Chain of Responsibility) 패턴 (0) 2024.11.24 생성 패턴(Creational Pattern) - 프로토타입(Prototype) 패턴 (0) 2024.11.23 행동(Behavioral) - 메멘토(Memento) 패턴 (0) 2024.11.22 행동(Behavioral) - 커맨드(Command) 패턴 (0) 2024.11.21