Java Design Pattern(14)
-
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 -
14. Chain of Responsibility Pattern
문제 클라이언트가 숫자를 필터링하는 프로그램을 개발해달라고 요청했다. 그런데 단순히 하나의 조건만 있는 것이 아니라 여러 필터를 순서대로 처리하고 싶다고 한다. 즉 체인의 형태로 구성하는 필터를 원하는 것이다. 아주 간단하게 프로그래밍한다면 if 문으로 다 처리할 수 있겠지만 프로그램의 규모가 커지고 복잡해질수록 유지보수하기 힘들어진다. 그렇다면 이를 어떻게 해결해야 할까? 해결 방안 이러한 문제는 역할 사슬 패턴으로 효과적으로 처리할 수 있다. 체인 역할을 하는 클래스를 이해하기 쉽도록 필터라고 부르겠다. 필터 클래스는 연결 리스트를 구현할 때처럼 next라는 멤버 변수를 갖고 있다. 이를 통해서 체인을 구현할 수 있는 것이다. 정수기에서 물을 정수하기 위해 여러 가지 필터를 사용한다고 생각하면 이해하..
2021.11.14 -
13. Bridge Pattern
문제 TV를 작동시키는 리모컨은 여러 제조사가 있다. 그래서 TV를 모든 리모컨으로 동작시키기 위해서는 리모컨을 인터페이스화 하고 TV를 컴포지션하여 사용할 수 있었다. 그런데 이젠 TV 제조사가 많아졌다. 기존에는 삼성이 모든 TV를 만들었지만 이젠 LG도 TV를 생산한다고 한다. 이를 어떻게 풀어야 할까? 해결 방안 이 문제를 해결하는 방법은 간단하다. 리모컨에서 한 것처럼 TV도 인터페이스화하고 리모컨에서는 TV 인터페이스를 컴포지션하면 된다. 클래스 다이어그램으로 나타내면 다음과 같다. 그리고 RemoteControl과 TV의 관계를 브릿지 관계라고 한다. Java 코드로 구현하면 다음과 같다. public class Client { public static void main(String[] ar..
2021.11.14