[Swift] Singleton Pattern

Yuni·2023년 12월 2일

Singleton Patton이란?

: 특정 용도로 객체를 하나만 생성해서 공용으로 사용하고 싶을 때 사용하는 디자인 패턴이다.

  • 하나의 인스턴스를 공유하기 위해
  • static을 사용하면 lazy한 효과가 있어 처음 사용되는 시점에 초기화 되기 때문에 사용하지 않는다면 메모리에 올라가지 않고 사용하는 시점에 메모리에 올라간다.

[ 싱글톤 패턴의 장점 ]

  1. 인스턴스를 최초 1회만 생성하므로 메모리 누수 방지 및 성능 측면에서 효율이 좋다.
  2. 전역으로 생성해서 다른 클래스 간 데이터 공유가 쉽다.
  3. 인스턴스가 1개라는 것을 보증할 수 있다.(Thread Safe)

[ 싱글톤 패턴의 단점 ]

  1. 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 개방-폐쇄 원칙(OCP)을 위배하게 된다. -> 수정과 테스트가 어려워짐
  2. 멀티 스레드 환경에서 동기화 처리를 해주지 않았을 때, 인스턴스가 두 개 이상 생성되는 문제가 발생할 수 있다.
    -> 싱글톤 패턴은 반드시 사용해야하는 이유가 없다면 지양하는 것이 좋다.

    OCP(Open-Closed Principle)란?
    기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계해야한다는 원칙이다. -> 확장에 개방적이고, 수정에는 폐쇄적임

[ Thread Safe ]

: 여러 쓰레드에서 어떤 객체에 대해 동시에 접근이 이루어져도 프로그램의 동작에 이상이 없는것.

만약 멀티 스레드 환경에서 동시에 싱글톤을 사용하는 경우 인스턴스가 2개 이상 생성되는 Thread Unsafe한 경우가 생길 수 있다.
-> 그러나 swift에서는 static let을 선언해서 1회 생성을 보장해 준다.

[ Singleton 클래스 활용 ]

  1. 전역으로 공유할 클래스 생성
Class CafeInfo {

}
  1. static let으로 객체의 인스턴스 생성
Class CafeInfo {
	static let shared = CafeInfo()
}
  1. 외부에서 초기화되는 것을 방지하기 위해 init() 함수의 접근 제어자를 private로 선언
Class CafeInfo {
	static let shared = CafeInfo()
    
    var name: String?
    var location: String?
    
    private init() {}
}
  1. 싱글톤 클래스 접근하는 방법
let info = CafeInfo.shared
info.location = "서울시 종로구"
  1. 출력
print(info.location) // 옵셔널타입임으로 옵셔널로 출력됨

if let location = info.location {
	print(location) // 옵셔널 바인딩

}

0개의 댓글