ukSeung iOS

[Swift] 싱글톤 패턴(Singleton Pattern) 본문

iOS/Swift

[Swift] 싱글톤 패턴(Singleton Pattern)

욱승 2022. 9. 7. 13:08

안녕하세요 욱승입니다.

이 포스팅에선 싱글톤 패턴에 대해 알아보고

Swift예시를 보며 이해하는 시간을 가지겠습니다!

 

1. 싱글톤 패턴(Singleton Pattern) 이란?

소프트웨어 디자인 패턴에서 싱글턴 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글톤 패턴(Singleton Pattern)이라고 한다. 주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.

객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미 !!

 

2. 싱글톤 패턴의 장단점

장점
- 한번의 Instance만 생성하므로 메모리 낭비를 방지할 수 있다.

- Singleton Instance는 전역 Instance로 다른 클래스들과 자원 공유가 쉬움

단점
- Singleton Instance로 많은 데이터를 공유 시킬 경우 다른클래스의 결합도가 높아져 "개방=폐쇄" 원칙을 위배함 즉, 수정과 테스트가 어려워짐

 

3. 싱글톤 클래스 생성 및 활용

3-1 Static 프로퍼티로 Instance 생성 및 init 함수 접근제어자를 private로 지정하기

class MyInfo {
    static let shared = MyInfo() // static을 이용해 Instance를 저장할 프로퍼티를 하나 생성
    
    var name : String?
    var age : Int?
    var male : Bool?
    
    private init() { }
}

 

3-2 싱글톤 클래스 접근

//ViewController

let info = MyInfo.shared
info.name = "욱승"
//View2Controller

let info = MyInfo.shared
info.age = 27
//View3Controller

let info = MyInfo.shared
info.male = true

 

어느 클래스에서든 shared란 static 프로퍼티로 접근하면 하나의 Instance를 공유

 

4. 싱글톤 클래스 소스 및 구현  - 화면 이동이 되어도 싱글톤 인스턴스를 참조하는 예제 소스

import Foundation

class MyInfo { // 싱글톤 클래스
    static let shared = MyInfo()
    
    var name : String?
    var age : Int?
    var male : Bool?
    
    private init() { }
}

 

import UIKit

class ViewController: UIViewController {
    let info = MyInfo.shared

    @IBOutlet weak var VC1Label1: UILabel!
    @IBOutlet weak var VC1Label2: UILabel!
    @IBOutlet weak var VC1Label3: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        info.name = "욱승" //싱글톤 인스턴스 name에 변수 초기화
    }
    
    override func viewDidAppear(_ animated: Bool) {
        if let str = info.name {
            VC1Label1.text = "MyInfo name \(str)"
        }else {
            VC1Label1.text = "MyInfo name => nil"
        }
        
        if let int = info.age {
            VC1Label2.text = "MyInfo age \(int)"
        }else {
            VC1Label2.text = "MyInfo age => nil"
        }
        
        if let bool = info.male {
            VC1Label3.text = "MyInfo male \(bool)"
        }else {
            VC1Label3.text = "MyInfo male => nil"
        }
    }
    
    @IBAction func nextAction(_ sender: Any) { // 다음 화면으로 가는 function
        guard let pushVC = self.storyboard?.instantiateViewController(identifier: "View2Controller") as? View2Controller else{
            return
        }
        
        self.navigationController?.pushViewController(pushVC, animated: true)
    }
}

 

import Foundation
import UIKit

class View2Controller: UIViewController {
    let info = MyInfo.shared

    @IBOutlet weak var VC2Label1: UILabel!
    @IBOutlet weak var VC2Label2: UILabel!
    @IBOutlet weak var VC2Label3: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        info.age = 27
    }
    
    override func viewDidAppear(_ animated: Bool) {
        if let str = info.name {
            VC2Label1.text = "MyInfo name \(str)"
        }else {
            VC2Label1.text = "MyInfo name => nil"
        }
        
        if let int = info.age {
            VC2Label2.text = "MyInfo age \(int)"
        }else {
            VC2Label2.text = "MyInfo age => nil"
        }
        
        if let bool = info.male {
            VC2Label3.text = "MyInfo male \(bool)"
        }else {
            VC2Label3.text = "MyInfo male => nil"
        }
    }
    @IBAction func nextAction(_ sender: Any) {
        guard let pushVC = self.storyboard?.instantiateViewController(identifier: "View3Controller") as? View3Controller else{
            return
        }
        
        self.navigationController?.pushViewController(pushVC, animated: true)
    }
}

 

class View3Controller: UIViewController {
    let info = MyInfo.shared

    @IBOutlet weak var VC3Label1: UILabel!
    @IBOutlet weak var VC3Label2: UILabel!
    @IBOutlet weak var VC3Label3: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        info.male = true
    }
    
    override func viewDidAppear(_ animated: Bool) {
        if let str = info.name {
            VC3Label1.text = "MyInfo name \(str)"
        }else {
            VC3Label1.text = "MyInfo name => nil"
        }
        
        if let int = info.age {
            VC3Label2.text = "MyInfo age \(int)"
        }else {
            VC3Label2.text = "MyInfo age => nil"
        }
        
        if let bool = info.male {
            VC3Label3.text = "MyInfo male \(bool)"
        }else {
            VC3Label3.text = "MyInfo male => nil"
        }
    }
}

 

 

 

예제소스

 https://github.com/shinseunguk/Singleton-Pattern

 

GitHub - shinseunguk/Singleton-Pattern: 싱글톤패턴 예제

싱글톤패턴 예제. Contribute to shinseunguk/Singleton-Pattern development by creating an account on GitHub.

github.com

 

Reference

https://babbab2.tistory.com/66

 

Swift) 싱글톤 패턴(Singleton Pattern)

안녕하세요 :) 소들입니다 이번 포스팅에선 싱글톤 패턴이 무엇이고, Swift에선 어떻게 사용되는지에 대해 알아보려고 해요!!! 왜 네트워크 하다가 갑자기 SingleTon이냐 하면 내 마음임 모든 포스팅

babbab2.tistory.com

 

728x90
반응형