ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 행위 패턴(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은 리터럴 숫자를 처리하는 터미널 표현식으로, 숫자 값을 그대로 반환합니다.
    • AddExpressionSubtractExpression은 각각 덧셈과 뺄셈을 처리하는 비터미널 표현식입니다. 각각 두 개의 표현식을 받아서 결과를 계산합니다.
    • 클라이언트 코드에서는 (5 + 3) - 2라는 수식을 표현식을 사용해 해석하고 결과를 출력합니다.

    4. 인터프리터 패턴의 장점과 단점

    장점

    • 문법의 규칙을 객체로 표현하여 확장하기 용이합니다.
    • 특정 언어나 수식의 해석 로직을 쉽게 구현하고, 그 로직을 모듈화할 수 있습니다.
    • 새로운 문법을 추가하는 것이 비교적 간단합니다.

    단점

    • 문법이 복잡해질수록 클래스가 많아지고, 코드가 복잡해질 수 있습니다.
    • 작은 문법을 처리할 때는 오히려 과도한 설계가 될 수 있습니다.
    • 비효율적인 해석을 초래할 수 있으며, 특히 문법이 깊고 복잡한 경우 성능 문제가 발생할 수 있습니다.

    5. 인터프리터 패턴의 사용 예시

    • 수식 해석기: 계산기, 수학 표현식 해석기 등.
    • 프로그래밍 언어의 구문 분석: 컴파일러나 인터프리터 구현.
    • 정규 표현식 엔진: 정규 표현식 문법을 해석하고 매칭하는 시스템.
    반응형

    댓글

Designed by Tistory.