- 일반적인 개발 상황에서 접하게 되는 문제들을 해결하기 위한 설계 패턴
- 개발 과정에서 설계에 대한 지침서

싱글톤 패턴이란, 특정 클래스의 인스턴스가 앱 전체에서 단 하나만 존재하며, 앱 전역에서 모두 접근할 수 있도록 하는 디자인 패턴을 말한다.
싱글톤 패턴을 자주 사용하는 예시
전반적인 관리의 역할을 하는 클래스를 일반적으로 Manager 라는 키워드를 붙여서 네이밍합니다.
import Foundation
// 싱글톤 클래스.
class Adam {
// shared 를 통해서 싱글톤 접근.
static let shared = Adam()
var mbti = "ENTJ"
var age = 29
// 클래스 생성 자체를 막아버리기 위해 init 을 private 으로 선언.
private init() {}
func printInfo() {
print("[Adam Info]")
print("mbti: \(mbti)")
print("age: \(age)")
}
}
// shared 를 통해서 싱글톤 클래스 사용.
Adam.shared.printInfo()
Adam.shared.mbti = "INTJ"
Adam.shared.age = 30
Adam.shared.printInfo()
static let shared 라는 싱글톤 접근점을 선언private init() {} 으로 클래스를 생성하지 못하도록 막음. shared 객체 하나만 살아있도록 구현.Adam.shared 가 불리고 난 뒤에는 앱이 종료될때까지 메모리 위에 올라가있는 상태. Adam.shared 를 호출하는 모든 부분은 단 하나의 인스턴스를 바라보고 접근하게 됨.
Delegate: 대리자, 대신 수행하는 사람, 위임자.- 어떤 일을 대신 처리하게 하는 패턴
- protocol 에 누군가 대신 처리해주길 바라는 내용을 작성하며 넘김.
- 그리고 그 일을 위임받은 객체는 그 일을 구체적으로 대신 처리.
UIKit내부에서도 많이 사용하는 디자인 패턴.
import Foundation
// 바리스타 프로토콜.
// 이 프로토콜을 만족하는 클래스는 커피를 만드는 책임을 갖습니다.
protocol Barista: AnyObject {
func makeCoffee() -> String
}
// 커피숍 클래스
class CoffeeShop {
// 델리게이트로 바리스타 프로토콜을 만족하는 클래스를 찾습니다.
weak var delegate: Barista?
init() {}
// 커피숍이 커피를 제공(serve) 하는 메서드를 갖고있습니다.
// 사실 내부를 살펴보면 delegate 가 커피를 만들고 (makeCoffe),
// 커피숍은 그 결과를 사용합니다.
func serveCoffee() {
guard let coffee = delegate?.makeCoffee() else { return }
print("주문하신 \(coffee) 나왔습니다.")
}
}
// 커피숍 인스턴스 생성
let coffeeShop = CoffeeShop()
// 바리스타 프로토콜을 만족하는 Adam 클래스.
// 프로토콜을 만족하기 때문에 커피숍의 델리게이트가 될 수 있습니다.
class Adam: Barista {
func makeCoffee() -> String {
"아이스 아메리카노"
}
}
let adam = Adam()
// 커피숍의 커피 만드는 위임자를 아담으로 설정.
coffeeShop.delegate = adam
// 커피숍에서 위임자를 사용해서 커피 제공 성공.
coffeeShop.serveCoffee()
델리게이트 패턴의 특징
Barista 프로토콜을 만족하는 누군가 대신 수행해주길 바라며 프로토콜의 메서드를 사용.수정에 용이한 구조가 됨.클래스 내부 코드의 수정이 필요하지 않음 import Foundation
protocol Barista: AnyObject {
func makeCoffee() -> String
}
class CoffeeShop {
weak var delegate: Barista?
init() {}
func serveCoffee() {
guard let coffee = delegate?.makeCoffee() else { return }
print("주문하신 \(coffee) 나왔습니다.")
}
}
let coffeeShop = CoffeeShop()
class Adam: Barista {
func makeCoffee() -> String {
"아이스 아메리카노"
}
}
let adam = Adam()
coffeeShop.delegate = adam
coffeeShop.serveCoffee()
class Eve: Barista {
func makeCoffee() -> String {
"카페라뗴"
}
}
let eve = Eve()
coffeeShop.delegate = eve
coffeeShop.serveCoffee()
UIKit 의 델리게이트 패턴 활용 예시
UITableViewDelegate 의 tableView(_:heightForRowAt:) 메서드.
tableView.delegate = self 라는 코드를 작성함으로써 내가 그 위임자가 되겠다고 선언.tableView(_:heightForRowAt:) 메서드 안에 실질적으로 높이를 설정하는 코드 작성.
출처: https://refactoring.guru/ko/design-patterns/observer

View 가 Data 를 구독하며, Data 의 변화가 일어났을 때 그 Data 를 View 에 적용시키는 구조로 많이 활용.