귀염둥이의 메모

[iOS] Singleton(싱글턴) 패턴 본문

iOS

[iOS] Singleton(싱글턴) 패턴

겸둥이xz 2021. 3. 10. 14:19
반응형

Singleton Pattern

  • 특정 용도로 객체를 하나만 생성하여, 공용으로 사용하고 싶을 때 사용하는 디자인 패턴.
  • 싱글턴은 특정 클래스의 인스턴스가 오직 하나임을 보장한는 객체.
  • 특정 클래스의 인스턴스가 딱 하나만 있기 때문에 다른 인스턴스들이 공유해서 사용할 수 있다.

Typical vs Singleton

 

class StudentInfo {
    var name: String?
    var major: String?
    var age: Int?
}

학생의 정보를 저장하는 StudentInfo가 있고

3개의 뷰컨트롤러 A ViewController, B ViewController, C ViewController가 있다.

 

  • A ViewController : 학생의 name을 입력 받는다.
  • B ViewController : 학생의 major를 입력 받는다.
  • C ViewController : 학생의 age를 입력 받는다.
// A ViewController
let studentInfo = StudentInfo()
student.name = "강태풍"
// B ViewController
let studentInfo = StudentInfo()
student.major = "경영학"
// C ViewController
let studentInfo = StudentInfo()
student.age = "22"

 

이렇게 A, B, C ViewController 각각 StudentInfo 객체를 생성해서 저장하면, 각각의 인스턴스의 프로퍼티에만 저장될 것이다.

한개의 인스턴스에 모든 정보가 저장되는 것이 아니라 따로 저장된다.

 

해결책으로 인스턴스가 참조 타입인것을 이용해서 StudentInfo 인스턴스를 한개 생성하고, 이 인스턴스르를 A, B, C로 필요할 때마다 참조로 넘겨줄 수 있다. 하지만 StudentInfo 인스턴스가 참조될때 마다 매번 이 인스턴스를 넘겨주는 작업이 필요하고, 코드도 복잡해진다.

 

StudentInfo 클래스에 대한 Instance는 최초 생성될 때 한번만 생성해서 전역에 두고(최초 한번 메모리 할당)

그 이후에는 이 인스턴스에만 접근 가능하게 한다.

이것이 바로 Singleton Pattern이다.

 

 

static을 이용해 인스턴스를 저장할 프로퍼티를 하나 생성한다.

 

A ViewController

// StudentInfo.shared 하는 순간 static 프로퍼티가 생성되어 메모리에 올라간다.
let studentInfo = StudentInfo.shared 
studentInfo.name = "강태풍"

 

B ViewController

// A ViewController에서 생성 되었기 때문에 그 인스턴스의 참조값을 전달한다.
let studentInfo = StudentInfo.shared
studentInfo.major = "경영학"

 

C ViewController

// A ViewController에서 생성 되었기 때문에 그 인스턴스의 참조값을 전달한다.
let studentInfo = StudentInfo.shared
studentInfo.age = 22

 

static 전역 변수로 선언하는데 이 프로퍼티는 지연생성(lazy)되기 때문에 처음 StudentInfo를 생성하기 전까지는 메모리에 올라가지않는다. 처음 선언하는 순간 메모리에 올라가고, 그 이후에는 처음에 생성된 인스턴스의 참조값을 전달한다.

 

 

init() 접근제어자를 private으로 지정

싱글턴 객체는 여러번 생성되는 것을 의도한 것이 아니면 그것을 막아서 새로운 객체가 생성되어 유일성이 사라지는 문제를 해결해야함.

해결책으로 클래스 이니셜라이저 private으로 설정하여 외부에서 또 다른 인스턴스를 생성하는 것을 막을 수 있다.

 

 

Singleton의 장점, 단점?

장점

  • 메모리 낭비를 방지한다. -> 한 번의 인스턴스만 생성하기때문에
  • 전역 인스턴스로 다른 클래스들과 자원 공유가 쉽다.

단점

  • 싱글턴 인스턴스가 너무 많은 작업을 하거나, 많은 데이터를 공유시키면 다른 클래스의 인스턴스들 간 결합도가 높아져서 "개방 = 폐쇄" 원칙을 위배한다. (객체 지향 설계 원칙에 어긋남)
  • 수정과 테스트가 어려워질 수 있다.
  • 멀티 스레드 환경에서 동시에 싱글턴 객체를 참조할 경우 원치 않은 결과를 가져올 수 있다.

 

Cocoa 프레임워크에서 Singleton 디자인 패턴을 활용하는 대표적인 클래스들

let screen = UIScreen.main
let userDefaults = UserDefaults.standard
let application = UIApplication.shared
let fileManager = FileManager.default
let notification = NotificationCenter.default

싱글턴 인스턴스를 반환하는 팩토리 메서드나 프로퍼티는 일반적으로 shared라는 이름을 사용한다.

 

 

 

 

<참고자료>

velog.io/@naroti/iOS-개발-Singleton-Pattern-q4k3uzgf0n

babbab2.tistory.com/66

부스트코스 - iOS앱 프로그래밍 www.boostcourse.org/mo326/lecture/16855?isDesc=false

반응형
Comments