디자인패턴14 디자인패턴 시리즈 14. 인터프리터 패턴 (Interpreter Pattern) 인터프리터 패턴 (Interpreter Pattern) 자주 등장하는 문제를 간단한 언어로 정의하고 재사용한다. 코드에 적용해보기 언어로 정의한다는 말은 약속을 한다는 뜻이다. 예를 들어 1 add 1은 피연산자: 1, 연산자: +, 피연산자: 1로 해석된다. add라는 명령을 사용했을 때 약속된대로 이를 해석하는 패턴이 바로 인터프리터 패턴이다. 대표적인 예시로 정규표현식이 있다. 일종의 패턴을 만들어 \d는 숫자를 의미하고, ^A는 A로 시작한다는 의미이다. 매번 문자열에서 어떤 패턴을 찾는 로직을 만드는 것보단 규칙을 정의하고 이를 해석하는 것이 더 낫다고 판단했기 때문이다. 다만 이를 남발하는 것은 좋지 않다. 인터프리터 패턴은 언어의 문법이 복잡해질수록 관리할 클래스가 많아져 오히려 복잡해진다... 2023. 1. 30. 디자인패턴 시리즈 13. 오브젝트 풀 패턴 (Object Pool Pattern) 오브젝트 풀 패턴 (Object Pool Pattern) 재사용 가능한 객체들을 모아둔 객체 풀 클래스를 정의한다. 객체가 필요로 할 때 풀에 요청하고 사용한 후엔 반환한다. 코드에 적용해보기 오브젝트 풀 패턴의 특성을 보면 마치 플라이웨이트 패턴과 유사하다고 느껴진다. 플라이웨이트 패턴은 특정한 클래스의 인스턴스 하나로 여러 개의 가상 인스턴스를 제공한다. 즉, 같은 인스턴스를 여러 객체에서 공유한다는 의미에서의 재사용이다. 메모리 차지를 최소한으로 줄이기 위해 사용하는 것이 목적이다. 반면 오브젝트 풀 패턴은 객체를 재사용하지만 하나의 객체는 독점적으로 사용된다. 반드시 사용하고 있지 않은 객체만을 재사용하는 것이다. 인스턴스를 만들 때 비용이 많이 드는 경우에 사용할 수 있다. 데이터 베이스 연결같.. 2023. 1. 27. 디자인패턴 시리즈 12. 책임 연쇄 패턴 (chain-of-responsibility Pattern) 책임 연쇄 패턴 (chain-of-responsibility Pattern) 1개의 요청을 2개 이상의 객체에서 처리해야 할 때 사용하면 좋은 패턴이다. 코드에 적용해보기 요청을 처리하는 인터페이스를 정의하고 여러 개의 객체를 체인 형태로 연결하여 책임을 맡기는 형태이다. 각각의 객체들은 해당 요청을 처리하지 못하는 경우에 다음 체인으로 책임을 넘기게 된다. 예를 들면 고객의 소리함이라고 하는 서비스를 운영한다고 하자. 소리를 보내는 방법은 이메일을 보내는 것이다. 그런데 이 메일들을 살펴보면 크게 3가지 특징이 있다. 각각 서비스에 대한 불만을 얘기하는 메일, 특정 상품을 출시 해달라는 메일, 스팸 메일이다. 순서대로 CS팀, MD에게 메일을 처리하게 하고 스팸 메일은 삭제 처리해야 한다. 메일을 종류.. 2023. 1. 25. 디자인패턴 시리즈 11. 프로토타입 패턴 (prototype Pattern) 프로토타입 패턴 (prototype Pattern) 특정한 클래스의 인스턴스를 만들 때 자원과 시간이 많이 들거나 복잡할 때 사용하면 좋은 패턴이다. 코드에 적용해보기 어떤 제품을 만들어서 출시하기에 앞서 테스트를 위한 샘플을 만드는데 이를 프로토타입이라고 한다. 객체를 생성하는 게 복잡하거나 이미 비슷한 객체가 있는 경우에 프로토타입 패턴을 이용하여 원본 객체를 새로운 객체에 복사하여 사용할 수 있다. 일반적으로 원본 객체를 복사하기 위해 자바의 clone() 메소드를 사용한다. Cloneable 인터페이스를 구현하여야 사용할 수 있으므로 상속 받는다. 예시 코드에서는 getClone() 메소드를 직접 만들어 구현해보겠다. public interface Prototype { public Prototyp.. 2023. 1. 24. 디자인패턴 시리즈 10. 플라이웨이트 패턴 (Flyweight Pattern) 플라이웨이트 패턴 (Flyweight Pattern) 특정한 클래스의 인스턴스 하나로 여러 개의 가상 인스턴스를 제공한다. 코드에 적용해보기 '꿈의 마을'과 같은 도시 건설 게임을 만든다고 하자. 간단하게 나무를 심는 로직을 설계한다고 할 때 이 나무들을 각각 x, y 좌표를 가지고 있다. Tree 인스턴스에는 나무의 상태가 저장이 되며, display() 메소드에 x, y 좌표, 나이 등을 바탕으로 화면에 나무를 그린다. 각각의 속성을 그리는데 필요한 데이터가 x: 4byte, y:4byte라고 했을 때 하나의 나무를 그리면 최소 8byte이상을 차지한다. 이를 수백, 수천개 그린다면 어떨까, 나무를 그리면 그릴 수록 데이터를 많이 차지한다. 메모리는 한정적인 자원이기 때문에 수억개의 나무를 그리면 더.. 2023. 1. 24. 디자인패턴 시리즈 9. 브리지 패턴 (Bridge Pattern) 브리지 패턴 (Bridge Pattern) 기능을 처리하는 클래스와 구현을 담당하는 추상 클래스를 구별한다. 구현과 더불어 추상화 부분까지 변경해야 한다면 사용하면 좋을 패턴이다. 코드에 적용해보기 만능 리모컨을 만들기로 해보자. 리모컨의 기능은 똑같은 추상화 부분을 바탕으로 하지만 TV의 모델마다 많은 구현 코드를 사용해야 하므로 객체 지향적으로 설계해야 한다. RemoteControl 인터페이스 또는 추상 클래스를 만들고 제조사마다 이를 상속 받는 구현 클래스를 만들었다. 사용자 인터페이스는 이미 추상화 했으므로 리모컨 사용자가 쓸 다양한 TV 종류에 따라 구상 클래스를 바꿔 쓸 수 있다. 하지만 사용자들이 제공하는 정보에 맞춰서 리모컨을 수정하다 보면 추상화 부분도 바꿔야 할 일이 생긴다. 구체적인.. 2023. 1. 24. 이전 1 2 3 다음