1. 싱글톤 패턴

상황을 가정해봅시다.

만약에 뷰컨을 넘어가면서 솝트 인적사항을 얻어야하는 경우를 생각해봅시다

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에서 쉽게 접근할 수 있도록 만드는 것이겠쬬! 그것을 충족시켜주는 것이 바로 싱글톤 패턴입니다!

2. 싱글톤이란?

한 개의 클래스로 만드는 객체는 단 한개여야만 한다는 규칙을 가진 디자인 패턴

프로그램 전체에 단 하나의 전역 객체를 만들어놓고 여기저기서 이 하나의 객체에만 접근할 수 있도록 하면 된다.

즉, 특정 용도로 객체를 하나만 생성하여, 공용으로 사용하고 싶을 때 사용하는 디자인 유형이다!

⇒ 정리하자면

클래스에 대한 인스턴스는 최초 생성될 때, 한번만 생성해서 전역을 두고,

그 이후로는 생성된 인스턴스에만 접근 가능하도록 하는 디자인

2-1. 싱글톤 구현하기

  1. static 프로퍼티로 Instance 생성하기

    → 전역에서 사용될 것이기 때문에 static을 Instance를 저장할 프로퍼티를 생성해준다.

  2. init 함수 접근제어자를 private로 지정하기

    → init 함수를 호출해 또 다른 Instance를 생성하는 것을 막기 위해, init() 함수 접근 제어자를 private로 지정한다.

  3. 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 = "류희재"
}

2-2. 싱글톤 패턴의 장단점