디자인 패턴
안녕하세요! 오늘은 디자인 패턴에 대해 알아보도록 하겠습니다. 시험에 꼭 나오는 내용인 만큼, 잘 숙지하면 좋을 것 같습니다.
디자인 패턴이란?
디자인 패턴은 소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 전형적인 해결책입니다. 이는 코드에서 반복되는 디자인 문제들을 해결하기 위해 맞춤화할 수 있는 미리 만들어진 청사진과 비슷합니다.
표준화된 라이브러리들이나 함수들을 코드에 복사해 사용하는 것처럼 패턴들을 붙여넣기식으로 사용할 수 없습니다. 패턴은 재사용할 수 있는 코드 조각이 아니라 특정 문제를 해결하는 방식을 알려주는 일반적인 개념입니다. 당신은 패턴의 세부 개념들을 적용하여 당신의 프로그램에 맞는 해결책을 구현할 수 있습니다.
패턴은 알고리즘과 자주 혼동됩니다. 왜냐하면 두 개념 모두 알려진 문제에 대한 일반적인 해결책을 설명하기 때문입니다. 알고리즘은 어떤 목표를 달성하기 위해 따라야 할 명확한 일련의 절차를 정의하지만, 패턴은 해결책에 대한 더 상위 수준의 설명입니다. 예를 들어 같은 패턴을 두 개의 다른 프로그램에 적용하면 두 프로그램의 코드는 다를 것입니다.
알고리즘은 요리법에 비유할 수 있지만 패턴은 요리법이 아닌 청사진에 더 가깝습니다. 알고리즘과 요리법 둘 다 목표를 달성하기 위한 명확한 단계들이 제시되어 있습니다. 반면에 청사진은 결과와 기능들은 제시하나 구현 단계 및 순서는 사용자가 결정합니다.
패턴의 분류
디자인 패턴은 복잡성, 상세도 및 설계 중인 전체 시스템에 대한 적용 범위에 따라 분류됩니다. 저는 도로 건설에 비유하는 걸 좋아합니다. 교차로를 더 안전하게 만들기 위해 신호등을 설치하거나 보행자를 위한 지하도가 있는 전체 다층 인터체인지를 구축하는 작업에 비유할 수 있습니다.
가장 기본적인 하위 설계 패턴을 이디엄이라고 합니다. 일반적으로 이디엄은 단일 프로그래밍 언어에만 적용할 수 있습니다.
아키텍처 패턴은 상위 설계 패턴이며 가장 보편적으로 사용됩니다. 개발자들은 거의 모든 언어로 아키텍처 패턴들을 구현할 수 있으며 다른 패턴들과 달리 애플리케이션 전체의 구조(아키텍처)를 설계하는 데 사용할 수 있습니다.
또한 모든 패턴은 패턴의 의도 또는 목적에 따라 분류할 수 있습니다. 이 책에서는 패턴의 주요 세 가지 그룹에 대해 다룹니다.
생성 패턴은 기존 코드의 재활용과 유연성을 증가시키는 객체 생성 메커니즘들을 제공합니다.
구조 패턴은 구조를 유연하고 효율적으로 유지하면서 객체와 클래스를 더 큰 구조로 조합하는 방법을 설명합니다.
행동 패턴은 객체 간의 효과적인 의사소통과 책임 할당을 처리합니다.
생성 패턴
기존 코드의 재활용과 유연성을 증가시키는 객체 생성 메커니즘들을 제공
팩토리 메서드
부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴입니다.
더욱 자세한 내용은 여기를 참고
추상 팩토리
관련 객체들의 구상 클래스들을 지정하지 않고도 관련 객체들의 모음을 생성할 수 있도록 하는 생성패턴입니다.
더욱 자세한 내용은 여기를 참고
빌더
복잡한 객체들을 단계별로 생성할 수 있도록 하는 생성 디자인 패턴입니다. 이 패턴을 사용하면 같은 제작 코드를 사용하여 객체의 다양한 유형들과 표현을 제작할 수 있습니다.
더욱 자세한 내용은 여기를 참고
프로토타입
코드를 그들의 클래스들에 의존시키지 않고 기존 객체들을 복사할 수 있도록 하는 생성 디자인 패턴입니다.
더욱 자세한 내용은 여기를 참고
싱글턴
클래스에 인스턴스가 하나만 있도록 하면서 이 인스턴스에 대한 전역 접근(액세스) 지점을 제공하는 생성 디자인 패턴입니다.
더욱 자세한 내용은 여기를 참고
구조 디자인 패턴
구조를 유연하고 효율적으로 유지하면서 객체들과 클래스들을 더 큰 구조로 조립하는 방법을 설명
어댑터
호환되지 않는 인터페이스를 가진 객체들이 협업할 수 있도록 함
더욱 자세한 내용은 여기를 참고
브리지
큰 클래스 또는 밀접하게 관련된 클래스들의 집합을 두 개의 개별 계층구조(추상화 및 구현)로 나눈 후 각각 독립적으로 개발할 수 있도록 하는 구조 디자인 패턴
더욱 자세한 내용은 여기를 참고
복합체
객체들을 트리 구조들로 구성한 후, 이러한 트리 구조들이 개별 객체들인 것처럼 작업할 수 있도록 하는 디자인 패턴
더욱 자세한 내용은 여기를 참고
데코레이터
객체들을 새로운 행동들을 포함한 특수 래퍼 객체들 내에 넣어서 위 행동들을 해당 객체들에 연결시크는 구조적 디자인 패턴
더욱 자세한 내용은 여기를 참고
퍼사드
라이브러리에 대한, 프레임워크에 대한 또는 다른 클래스들의 폭잡한 집합에 대한 단순화된 인터페이스를 제공
더욱 자세한 내용은 여기를 참고
플라이웨이트
각 객체에 모든 데이터를 유지하는 대신 여러 객체들 간에 상태의 공통 부분들을 공유하여 사용할 수 있는 RAM에 더 많은 객체들을 포함할 수 있도록 하는 구조 디자인 패턴
더욱 자세한 내용은 여기를 참고
프록시
다른 객체에 대한 대체 또는 자리표시자를 제공할 수 있음. 프록시는 원래 객체에 대한 접근을 제어하므로, 당신의 요청이 원래 객체에 전달되기 전 또는 후에 무언가를 수행할 수 있도록 함
더욱 자세한 내용은 여기를 참고
행동 디자인 패턴
알고리즘들 및 객체 간의 책임 할당과 관련이 있음
책임 연쇄
일련의 핸들러들의 체인(사슬)을 따라 요청을 전달할 수 있게 해주는 행동 디자인 패턴. 각 핸들러는 요청을 받으면 요청을 처리할지 아니면 체인의 다음 핸들러로 전달하지를 결정
더욱 자세한 내용은 여기를 참고
컨맨드
요청을 요청에 대한 모든 정보가 포함된 독립 실행형 객체로 변환. 이 변환은 다양한 요청이 있는 메서드들을 인수화할 수 있도록 하며, 요청의 실행을 지연 또는 대기열에 넣을 수 있도록 하고, 또 실행 취소할 수 있는 작업을 지원할 수 있도록 함.
더욱 자세한 내용은 여기를 참고
반복자
컬렉션의 요소들의 기본 표현(리스트, 스택, 트리 등)을 노출하지 않고 그들을 하나씩 순회할 수 있도록 함
더욱 자세한 내용은 여기를 참고
중재자
객체 간의 혼란스러운 의존 관계들을 줄일 수 있음
객체 간의 직접 통신을 제한하고 중재자 객체를 통해서만 협력하도록 함
더욱 자세한 내용은 여기를 참고
메멘토
객체의 구현 세부 사항을 공개하지 않으면서 해당 객체의 이전 상태를 저장하고 복원할 수 있게 해줌
더욱 자세한 내용은 여기를 참고
옵서버
여러 객체에 자신이 관찰 중인 객체에 발생하는 모든 이벤트에 대하여 알리는 구독 메커니즘을 정의할 수 있도록 함
더욱 자세한 내용은 여기를 참고
상태
객체의 내부 상태가 변경될 때 해당 객체가 그의 행동을 변경할 수 있도록 함
객체가 행동을 변경할 때 객체가 클래스를 변경한 것처럼 보일 수 있음
더욱 자세한 내용은 여기를 참고
전략
알고리즘들의 패밀리를 정의하고, 각 패밀리를 별도의 클래스들에 넣은 후 그들의 객체들을 상호교환할 수 있도록 함
더욱 자세한 내용은 여기를 참고
템플릿 메서드
부모 클래스에서 알고리즘의 골격을 정의하지만, 해당 알고리즘의 구조를 변경하지 않고 자식 클래스들이 알고리즘의 특정 단계들을 오버라이드(재정의)할 수 있도록 함
더욱 자세한 내용은 여기를 참고
비지터
알고리즘들을 그들이 작동하는 객체들로부터 분리할 수 있음
더욱 자세한 내용은 여기를 참고
폰 포스팅에서 사용한 이미지는 Refactoring.Guru를 참고했슴을 알려드립니다.





















