티스토리 뷰

반응형

안녕하세요 Pingu입니다. 🐧

 

지난 글에서는 행동 패턴 중 하나인 Command Pattern(커맨드)에 대해 알아봤었는데요, 이번 글에서는 또 다른 행동 패턴인 Interpreter Pattern(인터프리터)에 대해 알아보도록 하겠습니다.

인터프리터 패턴이란?

인터프리터 패턴이란 언어가 주어지면 해당 표현을 사용하여 언어로 문장을 해석하는 인터프리터를 사용하여 문법 표현을 정의하는 방법입니다.

 

어떤 문제가 자주 발생하는 경우 해당 문제를 간단한 언어로 표현하는 것이 편한데요, 이러한 문자들을 해석하는 역할을 인터프리터가 하게 됩니다. 대표적인 예로 정규표현식이 있는데요, 정규표현식은 문자열 패턴을 표현하는 데 사용하는 하나의 형식입니다. 정규표현식이 주어지면 규칙에 따라 처리해서 어떤 문자열을 해석하게 됩니다.

  • Abstract Expression
    • Abstract Syntax Tree의 모든 노드에서 사용할 Interpret 작업을 정의합니다.
  • Terminal Expression
    • 터미널 기호와 관련된 작업을 구현합니다.
    • 문장의 모든 터미널 기호에 인스턴스가 필요합니다.
    • 여기서 말하는 터미널 기호라고 함은 어떤 문장에서 의미있는 최소의 단위입니다.
  • Nonterminal Expression
    • 하나의 클래스는 문법이 가진 모든 규칙을 필요로합니다. (규칙은 R1... Rn으로 표현합니다.)
    • R1... Rn Symbol 각각에 대한 AbstractExpression 타입의 인스턴스 변수를 유지합니다.
    • Grammar에서 Nonterminal Symbol에 대한 해석 연산을 구현합니다. Interpret는 R1... Rn까지의 규칙을 나타내는 변수를 통해 재귀적 방식으로 해석합니다.
  • Context
    • Interpreter가 해석할 문장입니다.
  • Client
    • 문법이 정의하는 언어의 특정 문장을 나타내는 Abstract Syntax Tree를 정의합니다. Abstract Syntax Tree는 Nonterminal Expression, Terminal Expression의 인스턴스로 구성됩니다. 
    • Interpret 작업을 호출합니다.

인터프리터 패턴은 언제 쓰나요?

어떤 언어의 문법을 정의하고 해석할 때 인터프리터 패턴을 사용하면 좋습니다. 여기서 언어라고 함은 프로그래밍 언어, 자연어 등 다양하게 존재할 수 있습니다.

 

예를 들어 SQL 언어의 쿼리문을 해석하는 인터프리터를 만든다고 하면, "Select * From Worlds" 라는 쿼리문을 해석할 인터프리터를 만들어주면 되는 것이죠. 이러한 인터프리터는 쿼리 문의 여러 가지 문법을 가지고 입력받은 쿼리문을 해석하게 되고 해석된 쿼리문을 통해 원하는 DB작업을 할 수 있게 됩니다.

 

또한 정규표현식, 번역기 등이 좋은 예시가 될 수 있을 거 같아요.

인터프리터 패턴의 결과

장점

  • 문법 변경 및 확장이 쉽습니다.
    • 인터프리터 패턴은 클래스를 사용하여 문법 규칙을 나타내기 때문에 상속을 사용하여 문법을 변경하거나 확장 할 수 있습니다.
  • 문법을 구현하는 것도 쉽습니다.
    • Abstract Syntax Tree에서 노드를 정의하는 클래스는 비슷한 구현부를 가지고 있습니다. 따라서 이러한 클래스를 만들기 쉽고 Compiler, Parser를 사용하여 생성을 자동화할 수 있습니다.
  • 어떤 표현을 해석하는 새로운 방법을 쉽게 추가할 수 있습니다.

단점

  • 복잡한 문법은 유지하기 어렵습니다.
    • 인터프리터 패턴은 문법의 모든 규칙에 대해 하나 이상의 클래스를 정의하는데요, 따라서 많은 규칙을 갖고 있는 문법은 관리, 유지가 어려울 수 있습니다. 따라서 많이 복잡한 경우에는 컴파일러나 파서를 사용하는 것이 더 적합할 수 있습니다.

예제

인터프리터 Swift 예제 : https://github.com/kingreza/Swift-Interpreter

 

kingreza/Swift-Interpreter

Design Patterns in Swift: Interpreter . Contribute to kingreza/Swift-Interpreter development by creating an account on GitHub.

github.com

 

인터프리터 패턴은 지금까지 공부한 디자인 패턴 중 가장 어려웠던 패턴이었던거 같습니다.

아직도 구현하기엔 이해가 부족하다고 느껴 일단 가장 잘 구현된 것 같은 예제를 첨부했습니다.

이후에 직접 구현해보고 수정하도록 해야겠습니다.

 

혹시라도 틀린 부분이 있다면 알려주시면 감사하겠습니다.

 

감사합니다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함