Computer Sciences/Design Patterns(19)
-
Interpreter Pattern
개요 인터프리터는 프로그래밍 언어를 처음 배울 때 아마 많이 접했을 것이다. C, Java(명백히 말하면 아니지만)와 같은 언어를 컴파일 언어라고 하고 파이썬, 자바스크립트 같은 언어를 인터프리터 언어라고 한다. 인터프리터 언어는 컴파일이 아니라 코드 한 줄 한 줄을 해석하고 실행하기 때문에 간편하고 빠른 결과를 확인할 수 있다. 인터프리터 패턴은 이와 같이 간단한 문법을 해석할 때 사용되는 패턴이다. 말로 설명하는 것보다 코드로 이해하는 것이 더 빠르므로 바로 예제로 들어가자. 예제 - 자동차 전진 프로그램 자동차를 전진시키는 프로그램을 만들고자 한다. 커맨드로 움직임을 구현할 것인데 명령어 구성은 다음과 같다. program: 프로그램을 시작하는 커맨드 repeat: 루프를 시작하는 커맨드 go: 현..
2021.12.12 -
Memento Pattern
개요 메멘토 패턴(Memento Pattern)은 객체를 이전의 상태로 복구시켜야 하는 경우에 사용되는 패턴이다. 복원, 작업 취소 등의 작업이 필요할 때 사용된다. 시나리오 한 주사위 게임이 있다. 이 게임은 주사위가 1이 나오면 100원을 얻고 2가 나오면 현재 보유한 돈이 절반이 된다. 특별한 숫자인 6이 나오면 과일을 받는다. 돈이 전부 떨어지면 게임이 종료된다. 여기서 우리는 부정행위(?)를 하려고 한다. 현재 돈이 이전보다 많아지면 현재 돈을 저장해놓는다. 그러다가 나중에 돈이 너무 적어지면 저장해놓은 돈으로 복구시킨다. Class Diagram 코드 import java.util.ArrayList; import java.util.List; public class Memento { privat..
2021.12.11 -
Flyweight Pattern
개요 Flyweight는 격투기에서 가장 가벼운 몸무게 범주에 속한다. 그렇다면 이 패턴 또한 무언가를 가볍게 처리한다고 미루어 짐작할 수 있다. Flyweight 패턴은 어떤 클래스의 인스턴스 한 개를 이용하여 가상 인스턴스를 제공하고 싶을 때 사용한다. 예를 들어 스타크래프트를 생각해보자. 마린(해병)은 움직이기, 총 쏘기, 스팀팩 등 모두 공통적인 기능을 사용한다. 이때 200명의 마린 인스턴스를 전부 생성한다고 어떨까? 분명 공통적인 부분은 전혀 변하지 않는다. 그러나 모든 인스턴스가 이를 각자 가지고 메모리에 올라가기 때문에 불필요한 메모리 낭비가 발생한다. 이 패턴을 다시 말하면 어떤 클래스의 공통적인 기능들을 하나의 인스턴스를 공유하도록 하여 메모리를 절약하는 패턴이다. 이제 예제 코드를 살..
2021.12.11 -
Visitor Pattern
개요 방문자 패턴(Visitor Pattern)은 데이터 구조와 처리를 분리하는 패턴이다. 무슨 말인지 잘 와닿지 않을 것이다. 시나리오를 통해 알아보도록 하자. 시나리오 사용자가 내 컴퓨터의 디렉토리를 순회할 수 있는 프로그램을 만들어달라고 한다. 우리는 이를 재귀를 통해서 해결할 수 있다. 대략적으로 코딩하면 다음과 같을 것이다. // 디렉토리면 하위 디렉토리를 다시 순회하고 아니면 파일 정보 출력 if(file.isDirectory()) { Iterator iter = file.iterator(); iter.search(); } else { System.out.println(file.toString()); } 그런데 이젠 사용자가 각 파일에 대해 순회하면서 이름만 가져오는 기능도 원한다. 그렇다면 ..
2021.12.11 -
Prototype Pattern
개요 패턴에 앞서 프로토타입이 무슨 뜻인지 생각해보고 가자. 일반적으로 프로토타입이라고 하면 실제 제품을 만들기 전의 샘플 정도라고 알고 있을 것이다. 패턴도 이와 비슷한 맥락이다. 프로토타입 패턴은 생성 비용이 비싼(네트워크를 타거나, 생성 로직이 복잡하다던가) 객체나 비슷한 객체를 생성해야 할 때 사용되는 생성 패턴이다. 예를 들어 DB에서 데이터 구조가 거의 변하지 않는 데이터를 가져온다고 해보자. 필요한 데이터마다 객체를 네트워크를 거쳐서 가져오게 되면 비용이 만만치 않다. 대신 가져온 데이터를 복사해서 일부만 수정하는 방식이 있다. 이는 메모리 상에서 이루어지므로 네트워크 비용보다 훨씬 싸다. 또한 데이터 구조도 거의 비슷하기 때문에 복사하여 수정하는 것이 어렵지 않다. 예제 비슷한 구조에 대해..
2021.12.11 -
14. Chain of Responsibility Pattern
문제 클라이언트가 숫자를 필터링하는 프로그램을 개발해달라고 요청했다. 그런데 단순히 하나의 조건만 있는 것이 아니라 여러 필터를 순서대로 처리하고 싶다고 한다. 즉 체인의 형태로 구성하는 필터를 원하는 것이다. 아주 간단하게 프로그래밍한다면 if 문으로 다 처리할 수 있겠지만 프로그램의 규모가 커지고 복잡해질수록 유지보수하기 힘들어진다. 그렇다면 이를 어떻게 해결해야 할까? 해결 방안 이러한 문제는 역할 사슬 패턴으로 효과적으로 처리할 수 있다. 체인 역할을 하는 클래스를 이해하기 쉽도록 필터라고 부르겠다. 필터 클래스는 연결 리스트를 구현할 때처럼 next라는 멤버 변수를 갖고 있다. 이를 통해서 체인을 구현할 수 있는 것이다. 정수기에서 물을 정수하기 위해 여러 가지 필터를 사용한다고 생각하면 이해하..
2021.11.14