Swift

Swift - 디자인 패턴(생성 관련) - 싱글톤

Goniii 2023. 7. 8. 16:10

* Singleton (싱글톤 패턴)

- 어떤 클래스의 인스턴스가 오직 하나만 생성되고, 어디서든지 그 인스턴스에 접근할 수 있도록하는 디자인 패턴

- 전역 변수를 사용하지 않고 하나의 공유 인스턴스를 사용하여 데이터를 관리하고, 다른 객체들이 이 인스턴스를 공유하여 사용

- 메모리를 인스턴스 하나에만 할당하여 공유하며 사용하므로 메모리를 낭비하지 않음

 

 

장점

- 전역적인 접근성 : 어디서든 동일한 인스턴스에 접근 가능 -> 데이터 공유 및 상태 유지에 용이, 객체 간 일관된 동작 보장 

- 리소스 공유 : 인스턴스는 하나이므로, 매번 리소스를 새로 할당하는 비용을 절약 가능 

 

 

단점

- 의존성과 테스트 어려움 : 싱글톤은 전역적인 접근성을 가짐 -> 다른 객체들에 대한 의존성 강화 및 테스트 어려워짐 (의존성 주입을 통해 문제를 완화할 수 있지만, 의존성 관리를 복잡하게 만듦)

- 상태 공유와 동시성 문제 : 여러 객체가 인스턴스를 공유할 때 상태 변경에 대한 동기화 문제 발생 -> 적절한 동기화 메커니즘 필요

- 코드 복잡성 증가 : 인스턴스의 생성과 공유를 관리하는 로직이 추가되므로 코드가 복잡해지고 가독성이 저하됨 

 

 


* 싱글톤 패턴 사용 전 메모리 공간 

import UIKit

class SingletonViewController: UIViewController {

   // Pet 클래스 정의
    class Pet{
        
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

	// Pet 클래스 생성
        let myCat = Pet()
        let myDog = Pet()
        
    }
}

- 싱글톤 패턴을 구현하지 않고 Pet 클래스는 단순히 클래스 정의

- myCat, myDog이라는 두 개의 Pet 인스턴스를 생성

- 두 인스턴스의 주소 값이 다른 것을 확인 할 수 있음 

 

 

 

 

 


* 싱글톤 패턴 적용

import UIKit

class SingletonViewController: UIViewController {

    // Pet 클래스 정의, final : 상속 불가능
    final class Pet{
        static let shared = Pet()
        private init () {}
        
        
        var name : String = "짱아"
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Pet 클래스 생성
        let myCat = Pet.shared
        let myDog = Pet.shared
        
        print("myCat : ", myCat.name)
        print("myDog : ", myDog.name)
    }
}

- final을 사용하여 상속이 안 되도록 설정

- Pet 클래스의 내부에 객체를 생성하여 shared라는 정적 상수를 통해 싱글톤 인스턴스에 접근

- private init() 메서드를 통해 외부에서 인스턴스 생성을 막음 

- Pet 클래스 내 name 인스턴스 변수는 myCat, myDog에서 동일한 값을 가짐 -> 인스턴스를 공유하기 때문

- 마찬가지로 싱글톤을 사용하면 인스턴스 객체의 주소 값이 동일함 

 

 

 

 

 

 

 

참고)

https://babbab2.tistory.com/66 

 

Swift) 싱글톤 패턴(Singleton Pattern)

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

babbab2.tistory.com

https://www.youtube.com/watch?v=bhyCUykI4Dg