한 개의 클래스로 만드는 객체는 단 한개여야만 한다는 규칙을 가진 디자인 패턴
프로그램 전체에 단 하나의 전역 객체를 만들어놓고 여기저기서 이 하나의 객체에만 접근할 수 있도록 하면 된다.
즉, 특정 용도로 객체를 하나만 생성하여, 공용으로 사용하고 싶을 때 사용하는 디자인 유형이다!
조금 더 자세히 설명을 하자면 (개발자 소들님의 자료 참조)
우리가 아래와 같은 유저의 정보를 저장해야되는 상황일 때! 각각 다른 Controller에서 정보를 받는다고 가정하면
class UserInfo {
var id: String?
var password: String?
var name: String?
}
//A ViewController
let userInfo = UserInfo()
userInfo.id = "Sodeul"
//B ViewController
let userInfo = UserInfo()
userInfo.password = "123"
//C ViewController
let userInfo = UserInfo()
userInfo.name = "Sodeul"
위에 코드처럼 각각 다른 뷰컨에서 각각 다른 인스턴스들이 생성될 것이다. 이러면 우리가 원하는 아이디, 비번, 이름을 속성을 모두 가지고 있는 유저가 생성되지 않을것이다.
물론 인스턴스를 하나만 만들어서 뷰컨을 이동할때마다 해당 인스턴스를 참조로 넘겨줘도 되지만, 귀찮고 더럽고…더 보기.. 따라서
이 클래스에 대한 Instance는 최초 생성될 때 딱 한번만 생성해서 전역에 두고,
그 이후로는 이 Instance만 접근 가능하게 하자
static 프로퍼티로 Instance 생성하기
→ 전역에서 사용될 것이기 때문에 static을 Instance를 저장할 프로퍼티를 생성해준다.
init 함수 접근제어자를 private로 지정하기
→ init 함수를 호출해 또 다른 Instance를 생성하는 것을 막기 위해, init() 함수 접근 제어자를 private로 지정한다.
static 프로퍼티로 싱글톤 클래스 접근하기
→ 어느 클래스에서든 shared란 static 프로퍼티로 접근하면, 하나의 Instance를 공유하는 것이다.
class UserInfo {
static let shared = UserInfo() // -- 1
var id: String?
var password: String?
var name: String?
private init() { } // -- 2
}
// -- 3
//A ViewController
let userInfo = UserInfo.shared
userInfo.id = "Sodeul"
//B ViewController
let userInfo = UserInfo.shared
userInfo.password = "123"
//C ViewController
let userInfo = UserInfo.shared
userInfo.name = "Sodeul"
해당 객체는 단 한번만 만들어지기 때문에 메모리 관리가 편하다는 장점이 있다. 한번 만들어둔 객체를 꾸준히 재사용할 수 있다.