값 타입은 인스턴스를 생성하면 stack에 인스턴스 값을 저장한다. 그리고 변수/상수에 할당되거나 함수로 전해질 때 stack의 값이 복사되어 전달된다. 예를 들어, 새로운 변수에 값 타입이 전달되면, 원래 인스턴스 값(인스턴스의 실체)이 복사되어 stack에 들어가고 새로운 인스턴스가 생성된다.
struct Person {
var name = "lily"
var gender = "female"
}
let lily = Person()
let mike = lily // mike는 lily와 값은 같지만, 메모리 주소는 다른 새로운 인스턴스
참조 타입은 Heap에 인스턴스를 저장하고, Stack엔 Heap의 메모리 주소를 저장한다. 그리고 변수/상수에 할당되거나 함수로 전해질 땐 Stack의 메모리 주소(=참조)가 복사되어 전달된다. 예를 들어, 새로운 변수에 참조 타입이 전달되면, 메모리 주소가 전달되고 결국 새로운 변수도 동일한 인스턴스를 가리키는 꼴이 된다.
class Person {
var name = "lily"
var gender = "female"
}
let lily = Person()
let mike = lily // mike와 lily는 하나의 동일한 인스턴스의 메모리 주소를 공유
메모리와 연관지어 조금 더 딥하게 공부해보아야겠다!
전역에서 접근 가능한 단 하나의 클래스 인스턴스를 생성하는 디자인하는 패턴
활용 케이스
앱 전체에서 공유된 자원을 관리하고, control point가 하나여야 할 때
Singleton Pattern을 만드는 클래스 타입을 Singleton Class Type이라 한다.
만드는 방법
✅ 타입 프로퍼티에 클래스의 인스턴스를 할당한다.
단 하나이고, 전역에서 접근 가능한 타입 프로퍼티에 인스턴스를 저장해준다. 타입 프로퍼티는 처음 접근 될 때 lazy하게, 딱 한번만 초기화되도록 보장되어 있다. (multi-thread환경에서 동시다발적으로 접근하더라도 한 번만 초기화 된다)
타입 프로퍼티 명은 보통 shared
나 default
를 많이 쓴다.
class Singleton {
static let shared = Singleton()
}
추가적으로 아래와 같은 옵션을 줄 수 도 있다.
class Singleton {
static let shared = Singleton()
private init() { }
}
class Singleton {
static let shared: Singleton = {
let instance = Singleton()
// setup code
return instance
}()
}
의 특징과 장단점을 비교해가며 생각해보았다.