본문 바로가기
Design Pattern

15. 인터프리터 패턴 (interpreter pattern)

by 킹차니 2021. 12. 26.

 

인터프리터 패턴

(CS에서는 사람이 작성한 코드를 하드웨어가 이해할 수 있도록 변환해주는 장치를 인터프리터라고 한다.)

자주 등장하는 문제 🔜 간단한 언어 로 정의하고 재사용하는 패턴

--> 반복되는 문제 패턴을 언어 또는 문법으로 정의하고 확장할 수 있다.   ex) 정규표현식

 

(다이어그램을 보면 컴포짓 패턴과 매우 유사하다.)

Context 은 모든 Expression에서 사용하는 공통된 정보가 담겨있다.

Expression 은 우리가 표현하는 문법을 나타내는데,  Context가 들어 있는 것을 볼 수 있다.

TerminalExpression 은 그 자체로 종료되는 Expression이고

Non TerminalExpression 은 다른 Expression들을 재귀적으로 참조하고 있는 Expression이다.

 


코드로 알아보기

 

후위연산을 하는 코드가 있다고 하자. ( 후위연산 예 : "123+-"  ➡️  "1 - 2 + 3"와 같다. )

우리는 "123+-"와 같은 연산. 즉 "xyz+-"를 문법으로 정의하여 재사용할 것이라면 "xyz+-"를 트리구조로 표현할 수 있다.

xyz는 그대로 x면 x, y면 y, z면 z를 반환하면 되는 TerminalExpression이다.

하지만 "+-"과 같은 Expression은 다른 두개의 Expression을 interpret한 다음 그 결과를 연산하는 Non Termianl Expression이다.

 

먼저 App을 보자.

PostfixParser는 parse로 문자열을 파싱한다.

 

PostfixParser

parse메소드를 보면 받은 문자열을 character타입으로 나눈뒤, getExpression메소드를 사용하여 stack에 넣어준다.

그런데 parse의 반환 타입과 스택의 타입을 보면 모두 PostFixExpression인 것을 볼 수 있다. 

 

나머지 PostFixExpression 인터페이스는 아래와 같다.

모든 Expression들은 위의 인터페이스를 구현하면 된다.

 

먼저 값을 그대로 반환하는 Terminal Expression인 VariableExpression을 보자.

 

다음으로 Non Terminal Expression인 PlusExpression과 MinusExpression은 아래와 같다.

 

 

위에서 본 App을 실행해보면 아래와 같이 연산의 결과가 잘 나오는 것을 알 수 있다.

1 2 3 + - 4 + 의 결과 0

 

이를 디버거를 통해 보면 아래와 같은데, 

이는 트리 형태를 띄고 있다.

 

 

 

(+ 참고: 인터페이스에 static 메소드들을 정의하여 람다식을 반환하는 방법)


 

장점과 단점

 

장점

1. 자주 등장하는 문제 패턴을 언어와 문법으로 정의할 수 있다.

2. 기존 코드를 변경하지 않고 새로운 Expression을 만들 수 있다.

 

단점

복잡한 문법을 표햔하려면 Expression와 Parser가 복잡해진다.

 


 

 

실제로 어디에서 사용되나.

 

자바의 정규표현식

 

스프링의 expression language

 

 

출처: 인프런 백기선님 '코딩으로 학습하는 GoF 강의'
https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4