Singleton Pattern

이원희·2020년 12월 27일
0

 🐧 Swift

목록 보기
13/32
post-thumbnail

오늘은 싱글톤 패턴에 대해서 알아보자.

Singleton?!

  • 싱글톤은 하나의 디자인 패턴이다.
  • 특정 용도로 객체를 하나 생성하여 공용으로 사용하고 싶을때 사용하는 방법이다.
  • 환경 설정, 로그인 정보 등을 특정 용도로 생성해둔 객체에 넣어두고 여러 객체에서 접근 가능하도록 하여 데이터를 사용하는 것이다.
  • 이 객체는 임의로 메모리에서 해제해주지 않는 이상 프로그램이 실행되고 끝날때까지 메모리에 유지된다.

Singleton을 사용하지 않은 경우

class NormalSetting {
    var audioSound = 5
}

// in mainView
let mainViewSetting = NormalSetting()
mainViewSetting.audioSound = 1

// in musicView
let musicViewSetting = NormalSetting()
musicViewSetting.audioSound = 10

// in textView
let textViewSetting = NormalSetting()
textViewSetting.audioSound = 0

오디오 음량을 관리하는 NormalSetting class를 하나 만들어줬다.
mainView, musicView, textView 화면에서 각각 오디오 음량을 관리하려고 한다.

Singleton을 사용하지 않는다면 각각의 화면에서 오디오 음량을 설정해주기 위해 화면마다 NormalSetting 인스턴스를 생성한 후 관리해줘야한다.


Singleton을 사용하는 경우

class SingletonSetting {
    static let shared = SingletonSetting()
    private init() {}
    
    var audioSound = 5
}

// in mainView
SingletonSetting.shared.audioSound = 1
// in musicView 
SingletonSetting.shared.audioSound = 10
// in textView
SingletonSetting.shared.audioSound = 0

Singleton을 사용한다면 각 화면에서 NormalSetting 인스턴스를 생성하지 않고 해당 타입 즉, SingletonSetting class에 접근해 오디오 음량을 설정할 수 있다.


정리

왼쪽 도식이 Singleton을 사용하지 않은 경우이고, 오른쪽 도식이 Singleton을 사용한 경우이다.
Singleton을 사용하면 여러 view가 Singleton Setting class에 정의된 단 한개audioSound에 접근하게된다.


Singleton 뜯어보기

class SingletonSetting {
    static let shared = SingletonSetting()
    private init() {}
    
    var audioSound = 5
}

Singleton 패턴을 적용한 코드가 위와 같다는데 하나씩 뜯어보자.


static let shared = SingletonSetting()

static 키워드가 붙어있다!
그러므로 Type Property임을 알 수 있다.
(타입 프로퍼티가 뭔지 모른다면 이전 포스팅을 보고오길 추천한다!)

Type Property의 특징은 해당 타입에서 단 하나만 존재한다.
그러므로 SingletonSetting class에서 shared 프로퍼티는 단 하나만 존재함을 보장한다.

Type Property지연 생성(lazy)되기 때문에 처음 SingletonSetting class를 생성하기 전까지는 메모리에 올라가지 않는다.

shared는 싱글톤 인스턴스에 암묵적으로 쓰이는 이름이다.
(default, standard도 마찬가지)


private init() {}

private 키워드가 붙어있다!
private이 붙었으므로 SingletonSetting class에서만 init()을 사용할 수 있도록 제한해준다.
즉, 다른 class에서 SingletonSetting 인스턴스를 생성할 수 없도록 제한한다.


단점

Singleton 인스턴스가 다양한 부분에서 참조되어 많은 일을 하거나 데이터를 공유할 경우 다른 클래스의 인스턴스들 간 결합도가 높아져 설계에 위험이 존재하게 된다.
또한, 사용하지 않을때에도 메모리를 항상 잡고 있다.

늘 그렇듯 선택의 문제이다.
장점과 단점을 잘 생각해 보고 어떤 선택이 좀 더 합리적인지 잘 따져야할거 같다.


마무리

싱글톤에 대해서 알아봤다.
싱글톤을 적절하게 잘 사용하면 좋을거 같다.
그럼 이만👋

0개의 댓글