[Design Pattern] 싱글톤 패턴, Singleton Pattern

디자인 패턴 포스팅의 첫 타자는 싱글톤이다.
이유는 간단하다, ㅎ 내용이 쉬우니까 ㅎㅎ..

swift를 이용한 iOS 개발 중 주로 서버와 데이터를 주고 받는 역할을 하는 클래스나, 기기에 데이터를 유지 시키는 UserDefault 등에서 많이 사용되는 것으로 이해하고 있다!

싱글톤 패턴

전역 변수를 사용하지 않고 객체를 오직 하나만 생성하여 프로그램 어디에서든지 해당 객체를 참조할 수 있도록 하는 패턴

  • 특정 용도로 객체를 하나만 생성하여 프로그램 전체에서 사용하고자 할 때 이용되는 패턴이다
  • 환경설정, 로그인 정보 등을 특정 용도로 생성해둔 객체에 넣어두고 여러 객체에서 접근하도록 함
  • 임의로 메모리에서 해제하지 않는다면, 프로스램이 실행되고 끝날 때 까지 메모리에 올라가 유지된다!
  • 생성 패턴 (Creational Pattern)의 하나이다

💡 생성 패턴 (Creational Pattern) 이란?
객체 생성에 관련된 패턴, 객체의 생성과 조합을 캡슐화하여 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 주지 않도록 유연성을 제공


싱글톤 패턴 구조


사용 예 (Swift)

class Singleton {
    static let shared = Singleton()	// 객체 생성 없이 접근
    
    private var somethingImportant : String!
    
    private init() {	// 객체 인스턴스가 여러개 생성되는 것 방지
        self.somethingImportant = "important!"
    }
    
    func printSomethingImportant() -> Void {
        print(self.somethingImportant)
    }
}
Singleton.shared.printSomethingImportant() // "important 출력"
  • 클래스를 정의 할 때 해당 클래스와 같은 타입의 타입 프로퍼티를 생성하여 객체를 따로 생성하지 않아도 접근이 가능하도록 함!
  • static 전역 변수로 선언된 'shared' 프로퍼티는 지연생성 (lazy)되기 때문에 처음으로 'Singleton.shared' 와 같이 사용되기 전까지는 메모리에 올라가지 않는다!
  • 클래스의 initailizer를 private 으로 설정하여 객체가 여러번 생성되어 유일성이 깨지는 문제를 방지! (이것을 Thread-Safe 라 함)

멀티스레드 환경에서의 싱글톤

하지만 만약, 단일 스레드가 아닌 멀티 스레드 환경이라면 어떨까?

싱글톤 패턴을 사용할 때 가장 주의해야 하는 점 중 하나가 바로 멀티 스레드 환경에서 싱글톤 객체가 여러개 생성되는 문제인 것으로 알고있다.

Java 나 C++ 등을 이용해 싱글톤 패턴을 구현할 때에도, 이 부분에 특히나 주의해 임계구역등을 이용하곤 하는데,

운이 좋게도 swift의 'let'은 thread-safe 하기 때문에 'static let shared = Singleton()' 과 같이 생성된 싱글톤 객체는 특별한 처리가 필요 없는 것 같다!
스위프트 개굿..ㅎ



해당 포스팅은 다음 글을 참고하여 작성되었습니다!
참고 링크1
참고 링크2
참고 링크3

좋은 웹페이지 즐겨찾기