no image
[디자인 패턴] 구조, Facade pattern(퍼사드 패턴)
시스템을 구성하는 인터페이스들을 하나의 종합 인터페이스로 제공하는 디자인 패턴입니다.프로그램 내부의 서브시스템간에도 퍼사드 패턴을 사용해 복잡도를 줄일 수 있습니다.1️⃣ 동기프로그램을 구성하는 기능들을 작은 인터페이스들로 분리하면 수정에 유연한 구조를 만들 수 있습니다.하지만 클라이언트 입장에서 원하는 기능에 비해 많은 수의 인터페이스로 인해 복잡성이 커질 수 있습니다.또한, 불필요한 인터페이스들로 인해 시스템과 클라이언트 간의 결합도가 커질 수 있습니다. 퍼사드 패턴은 클라이언트와 시스템 사이의 의사소통 및 종속성을 최소화 하는 것을 가능하게 하는 패턴입니다.※ 클라이언트-시스템으로 표현했지만 하나의 프로그램을 구성하는 여러 서브 시스템들 간의 소통방식을 포함하는 개념입니다. 2️⃣ 활용성복잡한 서브..
2025.04.16
no image
[디자인 패턴] 구조, Decorator pattern(장식자 패턴) with Swift
객체에 동적으로 새로운 기능을 추가하고 싶은 경우 활용할 수 있는 패턴입니다.상속 없이 새로운 서비스를 추가하려는 것이 해당 패턴의 가장 큰 목표입니다.1️⃣ 동기기존 문자열 생성기가 만들어내는 문자열의 양끝에 반드시 대괄호를 추가할 필요가 있는 경우를 예시로 들어보겠습니다.해당 기능을 추가하기위해 문자열 생성기 타입인 Generator를 상속하는 BracketGenerator를 정의한는 것은 좋지 못합니다.양쪽 문자열에 큰 따옴표를 추가해야하는 새로운 기능이 생길 경우 모든 조합의 서브클래스를 생성해야하기 때문입니다.큰따옴표 + 대괄호, 대괄호 + 큰따옴표, 큰따옴표, 대괄호 ..이는 기능이 추가될 때마다 수많은 클래스를 생성함으로 답답한 확장성을 가지게 됩니다. 장식자 패턴의 장식자는 기능을 확장하기..
2025.04.15
no image
[디자인 패턴] 구조, Composite pattern(복합자 패턴) with Swift
부분을 표현하는 객체와 집합을 표현하는 객체를 모아 트리구조를 구성하기 위한 패턴입니다.개별 객체와 복합객체를 클라이언트 입장에서 동일하게(일관되게) 취급할 수 있다는 것이 해당 패턴의 핵심입니다. 1️⃣ 동기그림 툴을 사용하다보면 여러 요소들을 하나의 그룹으로 그룹화하여 이동 및 복제와 같은 동작을 수행할 수 있습니다.그리고 해당 그룹을 새로운 그룹의 일원으로 포함시킬 수 있습니다. 만약 그룹화를 위한 컨테이너 객체와 그룹의 요소들을 각기다른 클래스로(동일한 상위타입이 없이) 관리한다면 클라이언트 입장에서 현재 접근 중이 요소가 그룹인지 의미를 지는 요소인지 판단해야하는 분기처리가 필요합니다.복합체 패턴을 사용하면 모든 요소에 대한 동일한 접근 인터페이스를 제공하기 때문에 프로그램이 일관성을 가질 수 ..
2025.04.14
no image
[디자인 패턴] 구조, Bridge pattern(가교 패턴) with Swift
기능과 구현을 분리하여 각각 독립적으로 확장될 수 있도록 하는 디자인 패턴 입니다.해당 패턴에서 의미하는 기능과 구현의 분리는 추상 클래스, 프로토콜을 구체 타입으로부터 분리하는 것과는 다른 의미로 사용됩니다.가교 패턴의 경우 시스템의 설계가 완료되기 이전에 추상적 개념과 구현이 독립적으로 확장될 수 있다는 판단을 기반으로 사용할 수 있습니다.1️⃣ 동기리모컨으로 조작 가능한 텔레비전이 있다고 예시를 들어보겠습니다.클라이언트는 TV인터페이스를 통해 텔레비전을 끄거나 킬 수 있습니다.여기서 TV에 원격 종료 기능을 추가한다고 생각해보겠습니다.OCP원칙을 지키면서 해당 요구사항을 만족하기 위해 새로운 인터페이스를 만듭니다.새로운 기능이 기존의 시스템에서 문제없이 작동하기위해 각각의 새로운 인터페이스를 충족하..
2025.04.14
no image
[디자인 패턴] 구조, Adapter pattern(적응자 패턴) with Swift
구조 패턴은 더 큰 구조를 형성하기 위해 어떻게 클래스와 객체를 합성하는가에 주목하는 패턴입니다. 적응자 패턴은 객체를 특수한 목적으로 사용가능하도록 적응(변환)시키는 디자인 패턴입니다.해당 패턴은 주로 이미 개발이 완료된 서비스에 새로운 기능을 도입하려는 경우 새로운 기능과 기존의 기능의 인터페이스가 상이할 경우 활용할 수 있습니다. 1️⃣ 동기그림판 툴을 예시로 들어보겠습니다.프로그램은 Shape라는 클래스를 만들어 해당 클래스의 서브 클래스들이 드래그를 통해 위치를 옮기고 회전할 수 있는 기능을 제공합니다.원, 삼각형 과 같은 그래픽 객체를 추가하는 것은 비교적 간단했지만 텍스트 객체를 추가하는 경우 전혀다른 접근이 필요합니다.개발자는 기존의 TextView객체를 활용하여 해당 문제를 해결하고 싶었..
2025.04.13
no image
[자료구조] 균형 이진 탐색 트리(AVLTree)구현 with Swift(코드 포함)
1️⃣ 동기Swift에는 기본적으로 트리자료형을 지원하지 않습니다.Swift의 딕셔너리의 경우 내부적으로 키값들이 리스트로 반환됩니다.만약 "키값의 크기가 큰 순서대로 20개획득"같은 작업을 해여하는 경우 전체 키값을 추출한 이후 정렬이 필요합니다.즉, 추출하려는 요소의 수와 관계없이 O(N)의 복잡도를 가지게됩니다. 균형트리를 사용하는 경우에 M개의 요소를 오름차순으로 가져오는 연산의 경우를 살펴보겠습니다.우선 가장 깊은 노드를 획득하는데 필요한 복잡도가 트리의 높이 만큼인 O(log N)이 필요합니다.※ 균형 트리임으로 트리의 높이가 log N이 됩니다.그후 부터는 원하는 요소수 만큼의 접근이 이뤄짐으로 O(M)의 복잡도를 가집니다.결과적으로, O(M + logN)의 복잡도를 가지게됩니다. 2️⃣ 활..
2025.04.11
[디자인 패턴] 생성, Singleton pattern(단일체 패턴) with Swift
클래스가 오직 한개의 클래스 인스턴스를 갖도록 하면서 전역적인 접근을 가능하게 하기위해 사용하는 패턴입니다.1️⃣ 동기특정 클래스는 하나의 인스턴스만 갖는 것이 좋은 클래스가 있습니다.예를들어 파이어 베이스SDK의 경우 FirebaseCore객체를 통해 클라이언트의 인증정보가 관리되기 때문에 해당 객체가 여러개 존재하면 관리가 힘들어집니다. 2️⃣ 활용성클래스의 인스턴스가 오직한개이고 모든 사용자가 접근할 수 있도록 보장해야 합니다.싱글톤으로 사용되는 클래스는 서브 타이핑을 통해 확장 가능해야하며 이 과정에서 기존 코드 수정은 없도록 해야합니다. 3️⃣ 패턴 참여자단일체: 유일한 인스턴스를 생성하는 함수느인 instance함수를 정의합니다.일부 언어에서는 정적 함수가 아닌 정적 변수를 사용하기도 합니다...
2025.04.10
[디자인 패턴] 생성, Prototype pattern(원형 패턴) with Swift
원형이 되는 객체를 명시하고 전달시 해당 객체를 복제하여 전달하는 패턴입니다. 1️⃣ 동기악보에 음표를 생성하는 프레임워크를 만드는 경우, 개발자는 GraphicTool이라는 추상 클래스를 만들고 구체적인 음표의 세부사항은 클라이언트에 위임해야 확장성을 확보할 수 있습니다.클라이언트는 각각의 음표 클래스(Graphic클래스의 서브클래스)마다 GraphicTool클래스의 서브클래스를 만들어야 합니다.즉, 음표 서브클래스+생성 클래스가 병렬적으로 생성되어 많은 수의 클래스를 요구하게되는 구조가 만들어 집니다.클래스 생성을 줄이기 위한 방법으로 원형 패턴을 사용할 수 있습니다. 2️⃣ 활용성런타임에 구체적으로 협력할 객체를 지정하고 싶을 때구체 클래스와 생성 클래스가 병렬적으로 생성되는 구조를 피하고 싶을때생..
2025.04.10
[디자인 패턴] 생성, Factory method pattern(팩토리 매서드 패턴) with Swift
시스템이 사용할 구체적인 클래스 타입에 대한 결정을 서브 클래스로 위임하는 패턴이다. 1️⃣ 동기프레임워크를 개발하는 경우 클라이언트가 원하는 구체적인 동작사항을 프레임워크 제공자가 모두 예측하여 구현할 수 없습니다.이 경우 시스템이 활용하는 인터페이스를 클라이언트에게 제공하고 클라이언트가 인터페이스를 구체적인 객체를 구현한 후 시스템에게 전달하는 구조가 필요합니다.팩토리 매서드 패턴은 어떤 구체적인 객체를 생성해야 하는지에 대한 정보를 캡슐화함으로써 그것을 프레임워크로 부터 분리합니다. 2️⃣ 활용성자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때추상화를 통해 확정성을 확보합니다.생성에 대한 책임을 서브 클래스로 위임하고 싶을 때여기서 말하는 서브클래스는 추상 팩토리 매서드를 오버라이딩하여 구체..
2025.04.09