// User의 정보를 저장하는 클래스 classUserInfo{ 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 Class 만드는 법
static 프로퍼티로 인스턴스 생성하기
전역으로 저장될 것이므로, static을 이용해 Instance를 저장할 프로퍼티를 하나 생성한다.
1 2 3 4 5 6 7
classUserInfo{ staticlet 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
classUserInfo{ staticlet shared =UserInfo()
var id: String? var password: String? var name: String?
privateinit() { } }
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