디자인 패턴(구) 26

[디자인 패턴] 2장 - 옵저버 패턴(Observer Pattern) 알아보기

지난 시간에는 디자인 패턴의 필요성과 디자인 원칙에 대해 공부하였다. 지난 내용이 궁금하면 여기 클릭!! 이번 시간에는 옵저버 패턴에 대해 공부할 것이다. 이를 위해 상황 설명, 얻을 수 있는 장점, 그리고 코드로 옵저버 패턴에 대해 이해할 것이다. 참고한 내용은 다음과 같다. https://m.hanbit.co.kr/store/books/book_view.html?p_code=B6113501223 1. 객체와 객체지향? 객체는 실제를 본떠 새로운 세계를 창조하는 것으로, 각각의 객체는 자신의 역할과 책임을 다하고 각자의 역할을 충실한 채로 서로 협력하는 것을 객체 지향이라고 한다. 이 객체란 무엇인가에 대해 인지를 하고 다음 상황 설명을 보고, 음미해보면 더욱 이해가 잘 된다. 2. 상황 설명 우리는 ..

[디자인 패턴] 1장 - 디자인 패턴은 왜 필요할까? + 디자인 원칙

최근들어 필자는 더욱 더 기본에 충실한 개발자가 되기로 하였다. 그래서 다시 디자인 패턴을 공부하기로 했다. 사실 필자는 디자인 패턴 섹션이 있는데, 또 다시 공부하는 이유는 그때는 수준이 낮은 상태에서 공부하려니 기본적인 이해자체가 힘들었다. 보여주기식 공부를 한 것 같다. 다시 글을 보니 내가 보기에 이해가 너무 힘들고 딱딱하다. 고로, 공부를 다시 진행하고, 이를 정확하고 이해가 쉬운 방식으로 정리하기로 결심했다. 이를 진행하면서 참고하는 책은... GoF책은 디자인 패턴의 고전이고 정말 좋은 책이라지만... 2005년 이후로는 이 책이 훨씬 더 많이 팔렷고 부동의 1위라는 것이 헤드퍼스트 디자인패턴의 설명! (아기다리고기다리던책!) 이미 나는 영업당하고 말았다... 하여간 이 책을 기점으로, 학습..

방문자(Visitor) 패턴이란?

1. 방문자 패턴이란? 의도 객체 구조를 이루는 원소에 대해 수행할 연산을 표현합니다. 연산을 적용할 원소의 클래스를 변경하지 않고도 새로운 연산을 정의할 수 있게 합니다. 즉, 우리가 클래스를 많이 바꾸는것 없이 다양한 타입의 클래스를 메소드로 추가할 수 있다. 사용 시기 다른 인터페이스를 가진 클래스가 객체 구조에 포함되어 있으며, 구체 클래스에 따라 달라진 연산을 이들 클래스의 객체에 대해 수행하고자 할 때 객체 구조를 정의한 클래스는 거의 변하지 않지만, 전체 구조에 걸쳐 새로운 연산을 추가하고 싶을 때 각각 특징이 있고, 관련되지 않은 많은 연상이 한 객체 구조에 속해있는 객체들에 대해 수행될 필요가 있으며, 연산으로 클래스들을 더럽히고 싶지 않을 때 구조 Visitor : 객체 구조 내에 있는..

템플릿 메소드(Template Method) 패턴이란?

1. 템플릿 메소드 패턴이란? 의도 객체의 연산에는 알고리즘의 뼈대만을 정의하고 각 단계에서 수행할 구체적 처리는 서브클래스 쪽으로 미룬다. 알고리즘의 구조 자체는 그대로 놔둔 채 알고리즘 각 단계 처리를 서브클래스에서 재정의할 수 있게 한다. 즉, 알고리즘 구조를 서브 클래스가 확장할 수 있도록 템플릿으로 제공하는 방법이다. 사용 시기 어떤 한 알고리즘을 이루는 부분 중 변하지 않는 부분을 한 번 정의해 놓고 다양해질 수 있는 부분은 서브클래스에서 정의할 수 있도록 남겨두고자 할 때 서브클래스 사이의 공통적인 행동을 추출하여 하나의 공통 클래스에 몰아둠으로써 코드 중복을 피하고 싶을 때 서브클래스의 확장을 제어하고자 할 때 구조 Abstract Class : 서브클래스들이 재정의를 통해 구현해야 하는 ..

전략(Strategy) 패턴이란?

1. 전략 패턴이란? 의도 동일 계열의 알고리즘군을 정의하고, 각 알고리즘을 캡슐화하여, 이들을 상호교환이 가능하도록 만든다. 알고리즘을 사용하는 클라이언트와 상관없이 독립적으로 알고리즘을 다양하게 변경할 수 있게 한다. 다시 말하면, 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성(알고리즘군 정의)하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여(알고리즘을 캡슐화), 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법을 말한다.(이들을 상호교환이 가능하도록 만든다.) 이름에서 볼 수 있듯이, 객체의 행위를 우리가 원할 때, 즉 전략에 맞도록 변경하는 패턴이다. 사용시기 행동들이 조금씩 다를 뿐 개념적으로 관련된 ..

상태(state) 패턴이란?

1. 상태(state) 패턴이란? 의도 객체의 내부 상태에 따라 스스로 행동을 변경할 수 있게 허가하는 패턴. 이렇게 하면 객체는 마치 자신의 클래스를 바꾸는 것처럼 보인다. 사용 시기 객체의 행동이 상태에 따라 달라질 수 있고, 객체의 상태에 따라서 런타임에 행동이 바뀌어야 할 때 어떤 연산에 그 객체의 상태에 따라 달라지는 다중 분기 조건 처리가 너무 많이 들어 있을 때 구조 Context : 사용자가 관심있는 인터페이스를 정의. 객체의 현재 상태를 정의한 ConcreteState 서브클래스의 인스턴스를 유지 및 관리 State : Context의 각 상태별로 필요한 행동을 캡슐화하여 인터페이스로 정의 ConcreteState 들 : 각 서브 클래스들은 Context의 상태에 따라 처리되어야 할 실제..

감시자(Observer) 패턴이란?

1. 감시자 패턴이란? 의도 객체 사이에 일 대 다의 의존 관계를 정의해 두어, 어떤 객체의 상태가 변할 때 그 객체에 의존성을 가진 다른 객체들이그 변화를 통지받고 자동으로 갱신될 수 있게 만든다. 즉, 다수의 객체가 특정 객체 상태 변화를 감지하고 알림을 받는 패턴이다. 이것을 이용해 우리는 발행(publish)-구독(subscribe) 패턴을 구현할 수 있다. 사용 시기 어떤 추상 개념이 두 가지 양상을 갖고 하나가 다른 하나에 종속적일 때, 각 양상을 별도의 객체로 캡슐화하여 이들 각각을 재사용할 수 있다. 한 객체에 가해진 변경으로 다른 객체를 변경해야 하고, 프로그래머들은 얼마나 많은 객체들이 변경되어야 하는지 몰라도 될 때 어떤 객체가 다른 객체에 자신의 변화를 통보할 수 있는데, 그 변화에..

메멘토(Memento) 패턴이란?

1.메멘토 패턴이란? 이 단어를 인터넷에서 검색해봤다. 무언가를 기억하기 위한 방법이라는 것 같다. 짐작이 맞는지 한 번 알아가보자. 의도 캡슐화를 위배하지 않은 채 어떤 객체의 내부 상태를 잡아내고 실체화시켜 둠으로써, 이후 해당 객체가 그 상태로 되돌아올 수 있도록 한다. 즉, 쉽게 객체의 이전 상태를 저장하는 방법이다. 사용 시기 어떤 객체의 상태에 대한 스냅샷(몇 개의 일부)을 저장한 후 나중에 이 상태로 복구해야 할 때 상태를 얻는 데 필요한 직접적인 인터페이스를 두면 그 객체의 구현 세부사항이 드러날 수밖에 없고, 이것으로 객체의 캡슐화가 깨질 때 구조 Memento : 원조본 객체의 내부 상태를 저장 Originator : 원조본 객체. 메멘토를 생성해 현재 객체의 상태를 저장, 메멘토를 사..

중재자(Mediator) 패턴이란?

1. 중재자 패턴이란? 의도 한 집합에 속해잇는 객체의 상호작용을 캡슐화하여 객체를 정의한다. 객체들이 직접 서로를 참조하지 않도록 하여 객체 사이의 소결합을 촉진시키며, 개발자가 객체의 상효작용을 독립적으로 다양화시킬 수 있게 만든다. 즉, 여러 객체들이 소통하는 방법을 캡슐화하는 패턴이다. 사용 시기 여러 객체가 잘 정의된 형태이기는 하지만 복잡한 상호작용을 가질 때. 객체간의 의존성이 구조화되지 않으며 잘 이해하기 어려울 때 한 객체가 다른 객체를 너무 많이 참조하고, 너무 많은 의사소통을 수행해서 그 객체를 재사용하기 힘들 때 여러 클래스에 분산된 행동들이 상속 없이 상황에 맞게 수정되어야 할 때 위 상황에서 이 패턴을 사용하면 여러 컴포넌트간의 결합도를 중재자를 통해 낮출 수 있다 구조 Medi..

반복자(Iterator) 패턴이란?

1. 반복자 패턴이란? 의도 내부 표현부를 노출하지 않고 어떤 집합 객체에 속한 원소들을 순차적으로 접근할 수 있는 방법을 제공 집합 객체를 순회하는 클라이언트 코드를 변경하지 않고 다양한 순회 방법을 제공할 수 있다. 사용 시기 객체 내부 표현 방식을 모르고도 집합 객체의 각 원소들에 접근하고 싶을 때 집합 객체를 순회하는 다양한 방법을 지원하고 싶을 때 서로 다른 집합 객체 구조에 대해서도 동일한 방법으로 순회하고 싶을 때 구조 Iterator : 원소를 접근하고 순회하는 데 필요한 인터페이스를 제공 ConcreteIterator : Iterator에 정의된 인터페이스를 구현하는 클래스 Aggregate : Iterator 객체를 생성하는 인터페이스를 정의 ConcreteAggregate : 해당하는..