티스토리 뷰
shared 요거 많이 보셨죠?
오늘은 싱글톤에 대해 공부해보려 합니다.
싱글톤
생성된 객체를 어디서든 참조할 수 있도록 하는 패턴 입니다.
예를 하나 들자면,
UserInfo 라는 클래스가 있어요.
name, age, gender라는 프로퍼티가 있고.
class UserInfo {
var name: String?
var age: Int?
var gender: String?
}
3개의 ViewController가 있는데,
1번 ViewController는 UserInfo에서 name을 "Peppo"로 변경
2번 ViewController는 UserInfo에서 age를 100으로 변경
3번 ViewController는 UserInfo에서 gender를 "male"로 변경 하려고 합니다.
이렇게 하면 마지막에 UserInfo의 최종값은 어떻게 될까요??
이렇게 ?
class UserInfo {
var name = "Peppo"
var age = 100
var gender = "male"
}
라고 생각하시겠지만 아니에요 ㅠㅠ
아래 처럼 나옵니다.
// 1번 ViewController
let userInfo = UserInfo()
userInfo.name = "Peppo"
userInfo
// name: "Peppo", age: nil, gender: nil
// 2번 ViewController
let userInfo = UserInfo()
userInfo2.age = 100
userInfo
// name: nil, age: 100, gender: nil
// 3번 ViewController
let userInfo = UserInfo()
userInfo3.gender = "male"
userInfo
// name: nil, age: nil, gender: "male"
각 부분에 대해서만 변경이 될 뿐, 변경된 값을 계속 저장하고 있지않아요.
우리가 원하는건 한 인스턴스를 생성해놓고 어디서든 값을 공유할 수 있게 해주는게 목표 잖아요 ?
우리가 원하는대로 구현을 도와주는게 바로 싱글톤 입니다.
싱글톤 선언 방식
싱글톤 패턴은 이렇게 생성하시면 돼요!
class UserInfo {
static let shared = UserInfo() // <--- 이렇게!!
var name: String?
var age: Int?
var gender: String?
private init() {} // private을 붙여 init()을 호출해 Instance를 또 생성하는 것을 방지 !!
}
static 접근 방법은 타입프로퍼티 공부하면서 배웠죠!!
아래처럼 접근하시면 돼요.
// 1번 ViewController
let userInfo = UserInfo.shared
userInfo.age = 200
// 2번 ViewController
let userInfo = UserInfo.shared
userInfo.gender = "female"
// 3번 ViewController
let userInfo = UserInfo.shared
userInfo.name = "pepe"
이렇게 싱글톤을 해주게 되면
어느 클래스던 shared라는 static(타입 프로퍼티)로 접근하면
하나의 인스턴스를 공유 하게 됩니다.
클래스 UserInfo의 값은 이렇게 나올거에요.
class UserInfo {
var age = 200
var gender = "female"
var name = "pepe"
}
굉장히 좋아보이는데 싱글톤에도 장점과 단점이 있어요.
싱글톤 장점
- 메모리를 단 한번만 사용 합니다.
- 위에서 보았듯 하나의 인스턴스로 공유를 하기 때문에, 메모리 관리가 편하고, 재사용 할 수 있습니다.
- 객체 접근 시간이 줄어듭니다.
- 한번 만들어 두면 매번 객체를 만들어 접근하는것보다 빠릅니다.
- 전역 범위, 데이터 전달이 쉬워집니다.
- 하나의 객체로 어디서든 접근할 수 있어 데이터를 공유하기에 좋습니다.
싱글톤 단점
- private 생성자를 갖고 있어 상속이 불가능 합니다. (객체지향적이지 못함.)
- 테스트하기 힘들다.
싱글톤이 사용되는 대표적인 예
대표적인 예로는 아래와 같습니다.
let screen = UIScreen.main
let userDefaults = UserDefaults.standard
let application = UIApplication.shared
let fileManager = FileManager.default
왠지 저는 자주쓸것 같고, 써보면서 단점을 느껴봐야겠어요.
그럼 오늘 포스팅은 여기까지!
이해하는데 도움이 됐어요
https://babbab2.tistory.com/66
'iOS' 카테고리의 다른 글
[Swift] 문자열과 문자 (Strings and Characters) (0) | 2021.12.18 |
---|---|
[iOS] 알림창 띄우기 (alert) - UIAlertController (0) | 2021.12.17 |
[Swift] mutating (0) | 2021.12.11 |
[Swift] The Basics (0) | 2021.12.08 |
[Swift] 기본 연산자 (Basic) (0) | 2021.12.05 |
- Total
- Today
- Yesterday
- 2023년 회고
- Swift 프로퍼티
- Swift inout
- swift protocol
- RIBs tutorial
- swift (programmers)
- Swift Error Handling
- swift reduce
- Swift 프로그래머스
- Swift joined
- 원티드 프리온보딩
- Class
- Swift ModernRIBs
- removeLast()
- Swift
- Swift final
- Swift init
- swift programmers
- Swift Leetcode
- Swift joined()
- swift property
- ios
- Swift 내림차순
- RTCCameraVideoCapturer
- Swift RIBs
- swift 고차함수
- CS 네트워크
- Combine: Asynchronous Programming with Swift
- iOS error
- Swift 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |