싱글톤 패턴은 ??
특정 용도로 객체를 하나만 생성하여 공용으로 사용하고 싶을 때 사용하는 디자인 패턴
이해가 잘 안되시죠? 예제 보실게요
import UIKit
class Person {
var name: String?
var age: Int?
var adress: String?
}
// ViewControllerA
let personInfo = UserInfo()
personInfo.name = "이창형"
// name: 이창형
// age: nil
// adress: nil
// ViewControllerB
let personInfo = UserInfo()
personInfo.age = 26
// name: nil
// age: 26
// adress: nil
// ViewControllerC
let personInfo = UserInfo()
personInfo.adress = "울산"
// name: nil
// age: nil
// adress: 울산
사람의 정보를 저장하는 PersonInfo 라는 클래스를 만들고 A, B, C 라는 3개의 ViewController 가 있다고 가정해보죠!
A에서는 사람의 이름을 B에서는 사람의 나이를 C에서는 사람의 주소를 받아야 합니다. 하지만 이런식으로 받으면 UserInfo의 인스턴스를 A,B,C에서 3개를 생성해 줘야합니다. 하지만 이 인스턴스들은 모두 다른 메모리를 가리키게 되죠.
그래서 저희가 원하는 대로 한 사람의 모든 정보가 들어가지 않습니다!! 이를 싱글톤 패턴을 이용하여 수정해보도록 할게요.
class PersonInfo {
static let shared = PersonInfo()
var name: String?
var age: Int?
var adress: String?
private init() {}
}
// ViewControllerA
let personInfo = PersonInfo.shared
personInfo.name = "이창형"
// name: 이창형
// age: nil
// adress: nil
// ViewControllerB
let personInfo = PersonInfo.shared
personInfo.age = 26
// name: 이창형
// age: 26
// adress: nil
// ViewControllerC
let personInfo = PersonInfo.shared
personInfo.adress = "울산"
// name: 이창형
// age: 26
// adress: 울산
달라진 것이 뭘까요???🧐
shared라는 프로퍼티가 생성된 것과 private init() 생성자가 추가 되었다는 것 입니다.
shared는 static으로 선언되었기 때문에 프로그램이 실행될 때 메모리에 올라가고 그에 따라 personInfo 인스턴스는 딱 한 번 생성됩니다. let이라 변경도 불가능하죠!
이것을 이용하여 personInfo.shared를 사용하면 어디서든 인스턴스에 접근할 수 있고 static으로 선언되었기 때문에 인스턴스 내부의 프로퍼티 값을 공유합니다.
또한 생성자가 private 으로 선언되었기 때문에 외부에서 생성자를 다시 호출하여 인스턴스를 재생성하는 것을 방지할 수 있습니다.