iOS/Swift 상식

Singleton 패턴 알아보기

HJ39 2023. 2. 5. 00:03

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들 간의 결합도가 높아져 객체 지향 설계 원칙중 개방=폐쇄 원칙을 위배한다.
- 수정과 테스트가 어렵다.

 

 

 

# 참고한 사이트

  1. https://babbab2.tistory.com/66
  2. https://velog.io/@hayeon/Singleton-%ED% 8C% A8% ED%84% B4% EC% 9D%84-%ED%99% 9C% EC% 9A% A9% ED%95%98% EB% 8A%94-%EA% B2% BD% EC% 9A% B0% EB% A5% BC-%EC%98%88% EB% A5% BC-%EB%93% A4% EC%96% B4-%EC%84% A4% EB% AA%85% ED%95%98% EC% 8B% 9C% EC%98% A4

'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