Swift) Singleton Pattern에 대해 설명하시오.

Singleton Pattern

  • 특정 용도로 객체를 하나만 생성하여, 공용으로 사용하고 싶을 때 사용하는 디자인 유형
1
2
3
4
5
6
// User의 정보를 저장하는 클래스
class UserInfo {
var id: String?
var password: String?
var name: String?
}
  • 위와 같은 UserInfo 클래스가 있을 때,
    A ViewController에서는 id, B ViewController에서는 password, C ViewController에서는 name을 입력받아 전달해야 한다고 생각해보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
//A ViewController
let userInfo = UserInfo()
userInfo.id = "suzumsz"

//B ViewController
let userInfo = UserInfo()
userInfo.password = "123"

//C ViewController
let userInfo = UserInfo()
userInfo.name = "sujeong"

// 클래스로 선언했으니 뷰 컨트롤러마다 인스턴스를 만들어 값을 할당해줘야한다.

이렇게 A, B, C ViewController에 각각 UserInfo 객체를 만들어서 저장하면,

클래스 인스턴스 생성 후 전달하는 방법

💡 한 인스턴스에 모든 정보가 저장되는 것이 아닌, 위 사진처럼 각 Instance의 프로퍼티에만 값이 저장되는 것을 볼 수 있다.

위와 다르게, 한 인스턴스에 모든 정보를 저장하고 싶다면?

UserInfo를 싱글톤으로 만들어 사용하기

  • 클래스에 대한 Instance는 최초 생성될 때 딱 한번만 생성해서 전역에 두고, 그 이후로는 이 Instance만 접근 가능하게 한다.

Singleton Pattern

💡 한 인스턴스로 어느 클래스에서든 접근이 가능하다.

Singleton Class 만드는 법

static 프로퍼티로 인스턴스 생성하기

  • 전역으로 저장될 것이므로, static을 이용해 Instance를 저장할 프로퍼티를 하나 생성한다.
1
2
3
4
5
6
7
class UserInfo {
static let shared = UserInfo()

var id: String?
var password: String?
var name: String?
}

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

  • 혹시라도 init 함수를 호출해 Instance를 또 생생하는 것을 막기 위해, init() 함수 접근 제어자를 private로 지정해주면 된다.
1
2
3
4
5
6
7
8
9
class UserInfo {
static let shared = UserInfo()

var id: String?
var password: String?
var name: String?

private init() { }
}

Singleton Class 접근하는 방법

  • 어느 클래스에서든 shared라는 static 프로퍼티로 접근하면, 하나의 Instance를 공유할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
//A ViewController
let userInfo = UserInfo.shared
userInfo.id = "suzumsz"

//B ViewController
let userInfo = UserInfo.shared
userInfo.password = "123"

//C ViewController
let userInfo = UserInfo.shared
userInfo.name = "sujeong"

Singleton Pattern의 장단점

장점

  • 한 번의 Instance만 생성하므로 메모리 낭비를 방지할 수 있다.
  • Singleton Instance는 전역 Instance로 다른 클래스들과의 자원 공유가 쉽다.
  • DBCP(DataBase Connection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용 (쓰레드풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정, 로그 기록 객체 등)

단점

  • Singleton Instance가 너무 많은 일을 하거나, 많은 데이터를 공유시킬 경우 다른 클래스의 Instance들 간 결합도가 높아져 “개방=폐쇄” 원칙을 위배한다. (객체 지향 설계 원칙 어긋남)
  • 수정과 테스트가 어려워진다.

iOS Cocoa 프레임워크에서는 많은 싱글톤 패턴을 사용

많은 곳에 사용되는 Singleton Pattern
1
2
3
4
5
let screen = UIScreen.main
let userDefault = UserDefaults.standard
let application = UIApplication.shared
let fileManager = FileManager.default
let notification = NotificationCenter.default

참고

Swift) Singleton Pattern에 대해 설명하시오.

https://suzumsz.github.io/2021/10/11/Swift/Singleton Pattern/

Author

Sujeong Kim

Posted on

2021-10-11

Updated on

2021-10-12

Licensed under

댓글