no image
[디자인 패턴] 행동, Visitor pattern(방문자 패턴) with Swift
객체 구조(트리, 컬렉션 등)를 이루는 원소에 적용할 연산을 표현합니다.연산을 보유하는 클래스를 방문자라고 하며, 객체 구조의 요소를 방문하여 연산을 실행합니다.방문자는 추상화되어 있어 유연하게 변경가능합니다. 1️⃣ 동기여러가지 요소들로 이루어진 특정 객체 구조에 적용할 연산을 추상화하고 싶을 때가 있습니다.이 때 새로운 연산을 별도로 추가할 수 있지만, 추가된 연산에 상관없이 기존 코드들이 변형되지 않으면 좋을 것입니다.객체 적용할 연산들을 하나로 묶어서 관리하는 객체를 해당 패턴에서 방문자라고 칭합니다.새로운 연산을 원하는 경우 방문자 타입을 서브 클래싱하여 객체 구조에 주입하는 구조로 동작함으로써 기존 코드에 변형을 주지않고 유연하게 연산을 변경할 수 있습니다. 2️⃣ 활용성각각의 특징이 있지만 ..
2025.05.01
[디자인 패턴] 행동, Template method pattern(템플릿 메서드 패턴) with Swift
특정 연산의 절차는 유지하지만 구체적인 행동은 서브 클래스에 위임하는 패턴입니다. 1️⃣ 활용성변하지 않는 부분을 한 번 정의해 놓고 다양해질 수 있는 부분은 서브 클래스에서 정의할 수 있도록 남겨두고자 할 때 활용할 수 있는 패턴입니다. 2️⃣ 패턴 참여자AbstractClass: 변하지 않는 절차를 구현합니다. 그리고 서브 클래스가 재정의해야할 연산에 대해 기본 구현을 제공합니다.ConcreteClass: 구체적인 연산방식을 결정하고 필요한 함수를 재정의 합니다. 3️⃣ Swift구현구현시 유의할 점재정의할 수 있는 연산에 대해 특별한 네이밍을 부여할 수 있습니다.'do-' 같은 프리픽스를 제공하면 가독성이 향상됩니다.먼저 추상 클래스를 구현합니다.start함수의 경우 고정된 절차를 실행하는 매서드로..
2025.04.30
[디자인 패턴] 행동, Strategy pattern(전략 패턴) with Swift
특정 기능에 사용될 알고리즘을 캡슐화하여 동적으로 선택할 수 있도록 하는 패턴입니다.동작을 전략이라는 개념으로 추상화함으로써 새로운 전략을 추가하는 경우에 기존의 시스템을 수정하지 않고 단순히 사용할 전략을 교체하면됩니다. 1️⃣ 동기특정 동작에도 상황에 따라 최적으로 동작하는 여러가지 알고리즘이 있을 수 있습니다.해당 경우 상황에 따라 사용할 알고리즘을 하드 코딩하는 것은 좋지 못합니다.동작과 알고리즘이 결합되어 유지보수가 힘들고, 기존의 알고리즘을 교체하는 작업역시 까다롭기 때문입니다.전략 패턴을 활용하면 해당 문제를 해결할 수 있습니다. 2️⃣ 활용성행동이 조금씩 다를뿐 개념적으로 관련된 많은 클래스를 유동적으로 사용하고 싶을 때알고리즘의 변형이 필요할 때클라이언트에게 노출하지 말아야하는 알고리즘이..
2025.04.30
no image
[디자인 패턴] 행동, State pattern(상태 패턴) with Swift
객체가 메세지를 수신했을 때 현재 객체의 상태에 따라 행동을 동적으로 변경하고 싶은 경우 해당 패턴을 활용할 수 있다.해당 패턴은 객체의 상태를 추상화하여 분기문을 사용하지 않고도 행동을 결정할 수 있도록 하는 것이 핵심이다. 1️⃣ 동기동일한 요청을 받아도 현재 상태에 따라 각기다른 반응을 보일 필요가 있을 때 활용할 수 있습니다.상태를 enum객체로 만들어 내부적으로 분기문을 작성하는 경우를 대안으로 생각할 수 있습니다.이 경우 해당 객체가 처리할 수 있는 액션이 생길 때마다 분기문을 생성해야하며, 새로운 상태가 추가된다면 기존의 연산을 모두 수정해야하는 결과를 야기할 수 있습니다. 2️⃣ 활용성객체상태를 데이터로 표현하여 다중 분기 조건 처리가 너무 많아지는 경우 3️⃣ 패턴 참여자Context: ..
2025.04.28
no image
[디자인 패턴] 행동, 감시자 패턴(Observer pattern)
객체들 사이의 일 대 다 의존관계를 정의하여 특정 객체의 변화를 다른 객체에 전파하기위해 사용합니다.이 때 객체간 의존도를 최소화하기 위해 소통 주체와 감시자는 추상화된 타입으로 소통합니다. 1️⃣ 동기시스템에 어떤 변화가 발생했을 때 해당 변화를 시스템을 이루는 객체들에게 전파하여 시스템의 일관성을 유지해야하는 경우가 있습니다.하지만, 일관성 관리를 위해 객체간 결합도를 높이는 것은 객체 재사용성 및 유지 보수성을 훼손합니다.감시자 패턴은 두 객체간 소통을 추상화하여 위 문제를 해결하는 패턴입니다. 2️⃣ 활용성한 객체에 발생된 변화에 대해 얼마나 많은 객체가 영향을 받는지 예측할 수 없는 경우자신의 변화를 통보할 때, 해당 변화를 구독중인 구체적인 객체에 대해 알고싶지 않은 경우 3️⃣ 패턴 참여자S..
2025.04.28
[디자인 패턴] 행동, Memento pattern(메멘토 패턴) with Swift
객체지향에서 객체의 상태를 퍼블릭 인터페이스로 노출시키는 것은 의도치 않게 객체간 결합도를 높힘으로 지양해야합니다.하지만 특정 상태를 복원해야하는 기능의 경우 특정 객체의 상태를 면밀히 파악할 필요가 있습니다.메멘토 패턴은 객체의 내부 상태를 메멘토 객체로 캡슐화하여 노출 시켜 앞서 언급된 위험을 방지합니다. 1️⃣ 동기특정 동작을 수행한 이후 취소를 구현하려면 내부 상태 기록이 절대적으로 필요합니다.하지만 객체는 내부 상태를 캡슐화하는 것을 지향하기 때문에 외부로 상태를 노출시키지 않습니다.여기서 캡슐화 위배와 기능 구현의 트레이드 오프를 고려해야하는 부분이 발생합니다. 메멘토는 상태를 가진 객체(Originator)의 내부 상태를 스냅샷으로 저장하는 객체입니다.해당 스냅샷 정보에 접근할 수 있는 객체..
2025.04.26
no image
[디자인 패턴] 행동, Mediator pattern(중간자 패턴) with Swift
독립된 객체의 상호작용을 캡슐화 하는 것을 목표로 하는 패턴입니다.해당 패턴을 사용하여 개발자는 독립된 객체들의 상화작용에 다형성을 부여할 수 있습니다. 1️⃣ 동기하나의 행동을 여러 객체로 분할시키는 것은 해당 부분들에 대한 유연성을 확보할 수 있고 단위 테스트가 용이해지는 장점이 분명히 있습니다.하지만, 잘게 나뉘어진 객체들의 참조를 관리하는 추가적인 작업이 필요하고 추후 기능을 수정하기 위해 여러 클래스들에 대한 서비 클래스 혹은 새로운 타입들을 생성해야하는 작업이 필요할 수 있습니다.중재자 객체를 활용하면 상호작용에 관련된 책임을 하나의 객체로 응집시켜 위의 문제들을 일정부분 해결할 수 있습니다.독립된 객체들은 서로의 존재에 대해 알 필요없이 단순히 중재자와 소통을 통해 독립성을 유지합니다. 2️..
2025.04.26
no image
[디자인 패턴] 행동, Iterator pattern(반복자 패턴) with Swift
내부 표현부를 노출하지 않고 어떤 집합 객체에 속한 요소들을 순차적으로 접근하고 싶은 경우 활용할 수 있습니다. 1️⃣ 동기동일한 요소들의 집합에 여러가지 순회방법을 제공하고 싶은 경우 반복자 패턴을 활용할 수 있습니다.순회와 관련된 매커니즘을 객체 집합에서 분리시키면 다양한 순회 알고리즘을 적용할 수 있습니다.이를 다형성을 지닌 반복(plymorphic iteration)이라고 표현할 수 있습니다. 해당 패턴을 위해서는 요소들을 저장하는 객체집합을 위한 인터페이스와 객체집합을 순회하는 이터레이터 인터페이스가 필요합니다.객체집합 자료구는 createIterator함수를 통해 특정 이터레이터를 반환시키는 구조로 만들 수 있습니다. 2️⃣ 활용성객체 내부 표햔 방식을 알 필요없이 객체를 순회하고 싶은 경우..
2025.04.25
no image
[디자인 패턴] 행동, Command pattern(명령 패턴) with Swift
특정 작업에 대한 요청을 하나의 객체로 캡슐화하는 디자인 패턴입니다.이 패턴을 통해 요청을 처리하는 쪽과 요청을 보내는 쪽을 분리할 수 있으며, 동작의 유연성 확보, 로깅, 작업의 되돌리기(Rollback) 같은 기능을 쉽게 추가할 수 있습니다. 1️⃣ 동기특정 액션을 수신하는 객체가 실제로 어떤 작업을 수행하는지는 독립적으로 유지하고 싶은 경우가 있을 수 있습니다.이때 요청 자체를 하나의 객체로 캡슐화하면, 작업 실행과 요청 간의 결합도를 낮출 수 있고, 요청 취소, 재실행, 로깅 같은 부가 기능을 손쉽게 적용할 수 있습니다. 2️⃣ 활용성특정 액션에 대한 동작을 실행시점에 결정짓고 싶을 때실행 취소 기능을 지원하고 싶을 때시스템이 고장난 경우 수정중이던 사항을 재적용하고 싶을 때요청을 세분화하여 저장..
2025.04.24