디자인 패턴 총정리
·
개발
디자인 패턴이란? 디자인 패턴 : 소프트웨어 설계 과정에서 자주 발생하는 문제들에 대한 설계 방법론 디자인 패턴 개발 과정에서 반복되는 문제들을 대비한 모범 해결 사례라고 할 수 있다.디자인 패턴은 개발자들에게 문제 상황을 해결하는 원리를 알려준다. 디자인 패턴을 통해 얻을 수 있는 이점은 다음과 같다.재사용성 : 반복적인 문제에 대한 일반적인 해결책을 제시해준다.가독성 : 코드가 일정한 구조로 명확하게 정리된다.유지보수성 : 코드를 쉽게 모듈화할 수 있게 해준다.확장성 : 기존 코드를 변경하지 않고 새로운 기능을 구현할 수 있다.안정성, 신뢰성 : 검증된 솔루션을 제공한다.업무 효율성 : 팀원과의 소통을 효율적으로 할 수 있게 해준다. 디자인 패턴의 종류는 다음과 같다.생성 패턴 : 기존 코드의 재활용..
[ 디자인 패턴: 행동 ] (10) 방문자 (Visitor)
·
개발
방문자 : 알고리즘과 알고리즘이 동작하는 객체를 분리하는 디자인 패턴 건물을 돌아다니면서 물건을 파는 어떤 잡상인이 다음과 같이 행동한다고 해보자.주택에서는 가구를 판매함카페에서는 식기 도구를 판매함공공기관에서는 아무것도 판매하지 않음 방문자 패턴은 이러한 상황에서 각 경우마다 달라지는 잡상인의 동작을 정의한다.새로운 유형이 생기면 새로운 방문자를 추가하기만 하면된다. 즉, 방문자 패턴은 여러 객체지향 프로그래밍 원칙 중 특히 OCP에 집중한 디자인 패턴이다! 방문자 (Visitor) : 상황마다 달라지는 동작(메서드)를 정의한다.잡상인요소 (Element) : 방문자를 받아들이는 객체(상황)주택, 카페, 공공기관  예제 interface Visitor { String visit(House hous..
[ 디자인 패턴: 행동 ] (9) 템플릿 메서드 (Template Method)
·
개발
템플릿 메서드 : 여러 클래스에서 공통으로 사용하는 메서드를 템플릿화하여 상위 클래스에서 정의하고, 하위 클래스마다 세부 동작을 다르게 구현(오버라이딩)하는 디자인 패턴 템플릿 : 변하지 않는 것 템플릿은 상위 클래스에 구현하고, 자주 변경되며 확장해야 하는 기능은 하위 클래스에서 구현한다.상속을 극대화하여 알고리즘의 뼈대를 구조화하는 것에 초점을 둔다. 템플릿 메서드의 구조는 위와 같다. hook 메서드 : 부모 템플릿 메서드의 순서를 제어하기 위한 메서드 위의 예시에서는 step2 메서드가 훅 메서드라고 볼 수 있다.step2 메서드 결과에 의하여 step3 메서드의 호출 여부가 결정되기 때문이다. 예제 1 class AddCalculator{ private int a, b; // 생성..
[ 디자인 패턴: 행동 ] (8) 전략 (Strategy)
·
개발
전략 패턴 : 런타임에 알고리즘 전략을 선택하여 객체의 동작을 실시간으로 바꿀 수 있게 해주는 디자인 패턴 전략 (Strategy) : 특정한 목표를 수행하기 위한 행동 계획(알고리즘, 기능, 동작 등) 전략 패턴은 어떤 일을 수행하는 알고리즘이 여러가지 일 때, 동작들을 미리 전략으로 정의한다.이때, 전략을 쉽게 교체할 수 있도록 구현한다.따라서, 알고리즘이 빈번하게 교체되는 경우에 적합하다! 전략 패턴의 구조는 위와 같다.Context 객체가 알고리즘을 실행해야 할 때마다 해당 알고리즘을 구현하는 전략 객체의 메서드를 호출한다. 전략 패턴은 객체지향 프로그래밍을 굉장히 잘 활용한 디자인 패턴이라고 볼 수 있다.동일 계열의 알고리즘군을 정의각각의 알고리즘을 캡슐화각각의 알고리즘의 상호 교환이 가능클..
[ 디자인 패턴: 행동 ] (7) 상태 (State)
·
개발
상태 패턴 : 객체의 상태에 따라 행위가 달라지는 상황에서 상태를 조건문으로 검사해서 행위를 결정하는 대신, 상태를 객체화하여 상태가 행동을 취하도록 위임하는 디자인 패턴 객체지향 프로그래밍에서 클래스는 사물만 표현할 수 있는 것이 아니다.경우에 따라 행위/동작을 클래스로 표현할 수 있다. 따라서, 상태 패턴은 상태를 클래스로 구현함으로써 상태의 변화를 표현한다.상태에 따른 객체의 행위를 분리할 수 있으며, 새로운 행위를 추가하더라도 다른 행위에 영향을 미치지 않는다. 여기서 주의할 점은 대부분의 상황에서 상태 클래스는 싱글톤으로 관리되어야 한다는 것이다.상태는 객체의 현재 상태를 나타내기 때문에, 대부분의 상황에서 고유하게 존재해야 한다.  상태 패턴을 구현한 클래스 구조는 위와 같다. 예제 우리가 흔..
[ 디자인 패턴: 행동 ] (6) 옵저버 (Observer)
·
개발
옵저버 : 관찰자들이 관찰하고 있는 대상자의 상태가 변화하면, 대상자가 각 관찰자들에게 통지하고, 관찰자들은 알림을 받아 조치를 취하는 디자인 패턴 관찰자 (옵저버, 구독자)대상자로부터 알림을 기다린다.예시 : 카프카의 Consumer대상자 (발행자, Subject)이벤트가 발생하면 관찰자에게 이 사실을 알린다.예시 : 카프카의 Producer관찰자(옵저버)의 이름이 뭔가 능동적으로 대상을 관찰하는 뉘앙스를 보인다.그러나, 대상자를 '관찰'하기 보다는 정보를 '전달'받길 기다리는 것에 가깝다. 다른 디자인 패턴들과 다르게 1 : N 의존성을 가진다.주로, 분산 이벤트 핸들링 시스템 및 Pub/Sub 모델을 구현하는 데 사용된다. // 대상자(발행자)interface Subject{ // 옵저버 등록..
[ 디자인 패턴: 행동 ] (5) 메멘토 (Memento, Snapshot)
·
개발
메멘토 : 객체의 세부 사항을 공개하지 않으면서 해당 객체의 이전 상태를 저장하고 복원할 수 있게 해주는 디자인 패턴 텍스트 편집기 애플리케이션의 실행 취소 기능을 구현하고 있다고 가정하자.이전 상태를 복원하기 위해서는 애플리케이션이 객체의 상태를 기록해야 할 것이다. 상태를 복원하기 위한 스냅샷은 어떻게 생성될까?아마 객체의 모든 필드를 살펴본 후, 해당 값들을 저장소에 복사해야 할 것이다. 여기서 첫 번째 문제가 발생한다.대부분의 객체는 중요한 필드 데이터를 비공개로 해놓는 경우가 많다.따라서, 객체 값들의 복사가 불가능 할 수 있다.클래스 내부의 세부 정보를 모두 공개하면 클래스가 너무 취약해진다.클래스 상태에 접근하지 못하게 하면 스냅샷을 생성할 수 없다. 정말 운좋게도 첫 번째 문제가 발생하지 ..
[ 디자인 패턴: 행동 ] (4) 중재자 (Mediator)
·
개발
중재자 : 객체 간의 직접 통신을 제한하고 중재자 객체를 통해서만 협력하게 함으로써,  객체 간의 혼란스러운 의존 관계를 줄이는 디자인 패턴 위와 같이 회원가입 및 로그인을 수행하는 팝업창이 있다고 해보자.팝업창 내의 여러 요소들을 서로 상호작용 할 수 있다.예를 들어, 로그인 버튼을 눌렀는데 실패했다면 "비밀번호가 올바르지 않습니다"와 같은 에러 메시지가 등장할 수 있다. 각각의 요소들은 다른 요소들과 많은 관계를 맺을 수 있다.이에 따라, 일부 요소를 변경하면 다른 요소들에 영향을 줄 수 있다.  중재자 패턴은 이러한 상황에서 요소 간의 의존 관계를 줄여준다.즉, 상호작용하는 각각의 객체를 캡슐화함으로써 느슨한 결합을 유지하는 것이다. 예제 사용자를 추가/제거 할 수 있고, 특정 사용자가 다른 모든 ..