Singleton은 객체를 하나 생성하고 공용으로 사용하고 싶을 때 사용한다.
Singleton은 어떤 객체에서도 같은 데이터를 사용하고 싶을 때 사용하게 된다.
(환경설정, 네트워크 객체, 로그인 정보 등을 미리 생성해 둔 객체에 넣어두고 사용한다)
예를 들어 클래스 A, B, C가 있을 때 A의 데이터를 B, C 클래스에서 같은 데이터를 사용한다고 가정하자.
class A{
var data = "hello"
func printData() -> String { return data }
}
class B{
var a1 = A()
a1.printData() //hello
}
class C{
var a2 = A()
a2.printData() //hello
}
위 예제에서 A클래스 인스턴스를 B, C 클래스에서 생성하여 A 클래스의 프로퍼티에 접근하는 경우 a1, a2는 다른 객체를 갖게 된다.
이런 경우 메모리 낭비가 될 수 있고
만약 B 클래스에서 A 클래스의 프로퍼티인 data를 수정하는 경우
C 클래스에서 생성된 A 클래스 객체에는 반영되지 않게 된다.
singleton 적용하기
class A{
static let sharedA = A()
var data = "hello"
private init() { }
func printData() -> String { return data }
}
class B{
A.sharedA.printData() //hello
}
class C{
A.sharedA.printData() //hello
}
Singleton을 사용하려면 사용하고자 하는 클래스에서 자기 자신의 인스턴스를 저장할 프로퍼티를 생성하면 된다.
그리고 중요한 것!
init()을 private으로 꼭 설정해야 한다. (다른 클래스에서 다른 인스턴스를 생성하는 것을 방지하기 위함)
이렇게 설정하면 사용할 준비는 모두 끝났다.
이제 B, C 클래스에서 static 메서드나 프로퍼티에 접근했던 방법처럼 접근하여 사용하면 된다.
그러면 B, C 클래스에서 같은 인스턴스 객체를 가리키게 된다.
Singleton 장단점
장점 | - 하나의 Instance만 생성하여 공유하므로 메모리 낭비를 막을 수 있다. - 다른 클래스들과의 자원 공유가 쉽다. - 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용한다. |
단점 | - Singleton Instance가 너무 많은 일이 있거나, 많은 데이터를 공유하는 경우 다른 클래스의 Instance들 간의 결합도가 높아져 객체 지향 설계 원칙중 개방=폐쇄 원칙을 위배한다. - 수정과 테스트가 어렵다. |
# 참고한 사이트
'iOS > Swift 상식' 카테고리의 다른 글
Delegates vs Notification 동작 방식 (0) | 2023.02.18 |
---|---|
KVO(Key Value Observing) 동작 방식 (0) | 2023.02.11 |
Delegate 패턴 알아보기 (0) | 2023.02.04 |
Instance Method, Type Method (0) | 2023.02.04 |
Swift - String의 SubScript 접근 (0) | 2023.01.23 |