[디자인 패턴] 행동, 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
no image
[디자인 패턴] 행동, Chain of responsibility(책임-연쇄 패턴) with Swift
메세지를 보내는 객체와 메세지를 처리하는 객체간의 결합도를 없애기 위한 패턴입니다.요청에 대한 처리를 정적으로 설정하는 것이 아닌 여러 객체에게 처리할 수 있는 기회를 주어 유연성을 확보하고 싶은 경우 활용할 수 있습니다. 1️⃣ 동기프린트를 진행하는 버튼이 있습니다.해당 버튼에 마우스를 올리면 버튼의 기능에 대한 도움말이 표시됩니다.버튼의 경우 다양하게 활용될 수 있습니다.프린 기능에 대한 도움말 표시를 정적 코드로 구현하게 된다면 해당 버튼은 특정 문맥에 종속적인 버튼이 되어 버립니다.따라서 다른 객체에게 도움말을 줄 것을 위임하여 유연성을 확보할 수 있습니다.여기서 책임-연쇄 패턴을 활용할 수 있습니다. 2️⃣ 활용성특정 메세지(예를들어 현재 문맥에서의 도움말을 표시해줘)를 처리할 수 있는 여러 ..
2025.04.23
no image
[디자인 패턴] 구조, Proxy pattern(프록시 패턴) with Swift
특정 객체에 대한 접근을 대리자를 통해 간접적으로 접근할 수 있도록 합니다.대리자는 중간 과정에서 접근의 유효성을 판단하거나 별도의 최적화 작업을 추가해줄 수 있습니다. 1️⃣ 동기객체가 필요한 시점이 아님에도 메모리를 점유하고 있다면 이는 리소스 낭비입니다.이미지 객체를 참조하고 있지만 해당 객체가 실제로 사용될 시점은 화면상에 표시되는 시점이 될 것입니다.이때 객체 생성에 대한 책임을 프록시 객체에 부과하여 최적화할 수 있습니다.프록시 객체는 이미지 생성에 관한 함수를 내부적으로 구현하고 Draw와 같은 랜더링 메세지를 수신시 비로서 이미지 객체를 생성하는 방식으로 최적화를 진행할 수 있습니다. 2️⃣ 활용성프록시 패턴은 단순히 구체적인 객체에 대한 참조를 유지한다기 보단 상황과 전략에 따라 참조 객..
2025.04.23