만약에 뷰컨을 넘어가면서 솝트 인적사항을 얻어야하는 경우를 생각해봅시다
A ViewController에서는 이름을, B ViewController에서는 파트를, C ViewController에서는 시작기수를 받아야 된다고 생각해보자고요!
그러면 일반적으로 가장 먼저 드는 생각은 화면 이동시 해당 객체를 넘겨주는 겁니다! 한번 구현해볼까요?
struct SoptMember {
var name: String?
var part: String?
var start: Int?
}
class AViewController: UIViewController {
var soptMember = SoptMember(name: "희재", part: nil, start: nil)
//대충 화면 이동 코드, dataBind
func pushToBVC() {
let bVC = BViewController()
bVC.dataBind(soptMember: soptMember)
self.navigationController?.pushViewController(bVC, animated: true)
}
}
class BViewController: UIViewController {
var soptMember: SoptMember?
func dataBind(soptMember: SoptMember) {
self.soptMember = soptMember
setPart()
}
func setPart() {
self.soptMember?.part = "아요"
}
func pushToCVC() {
let cVC = BViewController()
cVC.dataBind(soptMember: soptMember ?? SoptMember())
self.navigationController?.pushViewController(cVC, animated: true)
}
}
class CViewController: UIViewController {
var soptMember: SoptMember?
func dataBind(soptMember: SoptMember) {
self.soptMember = soptMember
setStart()
}
func setStart() {
self.soptMember?.start = 31
}
}
대충 코드로 만들었는데요! 음… 딱 봤을 때도 뭔가 마음이 불편해지는 이유는
<aside> 💡 어차피 한개만 있는 인스턴스의 프로퍼티를 꾸며주는 건데, 왜? 이곳저곳에서 불러야 되는거지? 계속 dataBind를 “굳이” 해야되나? 라는 부분일것입니다!
</aside>
그럼 우리가 하고 싶은것은, 다양한 ViewController에서 쉽게 접근할 수 있도록 만드는 것이겠쬬! 그것을 충족시켜주는 것이 바로 싱글톤 패턴입니다!
한 개의 클래스로 만드는 객체는 단 한개여야만 한다는 규칙을 가진 디자인 패턴
프로그램 전체에 단 하나의 전역 객체를 만들어놓고 여기저기서 이 하나의 객체에만 접근할 수 있도록 하면 된다.
즉, 특정 용도로 객체를 하나만 생성하여, 공용으로 사용하고 싶을 때 사용하는 디자인 유형이다!
⇒ 정리하자면
클래스에 대한 인스턴스는 최초 생성될 때, 한번만 생성해서 전역을 두고,
그 이후로는 생성된 인스턴스에만 접근 가능하도록 하는 디자인
static 프로퍼티로 Instance 생성하기
→ 전역에서 사용될 것이기 때문에 static을 Instance를 저장할 프로퍼티를 생성해준다.
init 함수 접근제어자를 private로 지정하기
→ init 함수를 호출해 또 다른 Instance를 생성하는 것을 막기 위해, init() 함수 접근 제어자를 private로 지정한다.
static 프로퍼티로 싱글톤 클래스 접근하기
→ 어느 클래스에서든 shared란 static 프로퍼티로 접근하면, 하나의 Instance를 공유하는 것이다.
class SoptMember {
static let shared = SoptMember() // 싱글톤 객체 생성
private init() {} // 생성자 접근 제어
var name: String?
var part: String?
var start: Int?
}
class AViewController: UIViewController {
let soptMember = SoptMember.shared()
soptMember.name = "류희재"
}