티스토리 뷰

iOS

[iOS] Swift 싱글턴 톺아보기

국산 앨런 2019. 7. 31. 14:54

싱글턴(Singleton)

싱글턴은 '특정 클래스의 인스턴스가 오직 하나임을 보장하는 객체'를 의미합니다.

 

싱글턴은 애플리케이션이 요청한 횟수와는 관계없이 이미 생성된(static) 같은 인스턴스를 반환합니다.

 

즉, 애플리케이션 내에서 특정 클래스의 인스턴스가 딱 하나만 있기 때문에 다른 인스턴스들이 공유해서 사용할 수 있습니다.

 

 

예시를 통해 살펴보겠습니다.

 

메타몽 소환!

 

간단하게 버튼에 따라서 서로 다른 페이지를 띄워주고 다시 뒤로 갈 수 있는 UI를 구성했습니다

 

class Singleton{
    
    static let shared = Singleton()
    
    var state: MetamongState?
}

enum MetamongState: String{
    case metamong
    case metamong_changed
}

 

사용될 싱글턴 클래스를 선언해 주고

 

//ViewController.swift
if let state = Singleton.shared.state{
    switch(state){
		case .metamong:
			metamong.image = UIImage(named: "metamong")
			label.text = "짠"
		case .metamong_changed:
			metamong.image = UIImage(named: "metamong-changed")
			label.text = "변신완료!"
	}
}

 

Singleton 인스턴스의 state에 따라 UI를 변경시켜줍니다.

 

** 저는 편의상 viewWillAppear 안에 구현을 했지만 원래 이러면 안돼요..... view의 흐름과 data는 별개로 작동을 해야합니다.. **

 

//SecondViewController.swift
//ThirdViewController.swift
@IBAction func buttonAction(_ sender: Any) {
        Singleton.shared.state = .metamong
        //or Singleton.shared.state = .metamong_changed
        dismiss(animated: true, completion: nil)
    }
}

 

띄워질 화면에서는 UIButton 의 action만 연결해 줍니다.

 

요로코롬 싱글턴이 잘 작동하는 것을 확인하실 수 있어요 !

 

Cocoa 프레임워크에서의 싱글턴 디자인 패턴

Cocoa 프레임워크에서 싱글턴 디자인 패턴을 활용하는 대표적인 클래스를 소개합니다.
싱글턴 인스턴스를 반환하는 팩토리 메서드나 프로퍼티는 일반적으로 shared라는 이름을 사용합니다.

FileManager

  • 애플리케이션 파일 시스템을 관리하는 클래스입니다.
  • 파일 및 디렉토리를 만들어 앱에서 관리하는 개인 데이터 파일을 저장할 수 있습니다.
  • FileManager.default

URLSession

  • URL 세션을 관리하는 클래스입니다.
  • endpoint가 명시된 곳으로 부터 data를 주고 받을 수 있습니다. 
  • URLSession.shared

NotificationCenter

  • 등록된 알림의 정보를 사용할 수 있게 해주는 클래스입니다.
  • Observer 패턴을 적용하여 Observer에서 Event에 대한 처리를 구현하고 NotificationCenter에서 Event의 알림(+data)을 보내 콜백을 일으킵니다.
  • NotificationCenter.default

UserDefaults

  • Key-Value 형태로 간단한 데이터를 저장하고 관리할 수 있는 인터페이스를 제공하는 데이터베이스 클래스입니다.
  • UserDefaults.standard

UIApplication

  • iOS에서 실행되는 중앙제어 애플리케이션 객체입니다.
  • iOS App 하나에 하나만 존재
  • delegate에게 중요한 런타임 이벤트(ex: 앱 시작, 메모리 부족 경고 및 앱 종료 등) 을 알리고, 적절히 응답 할 기회을 제공합니다.
  • UIApplication.shared


싱글턴 디자인 패턴은 애플리케이션 내의 특정 클래스의 인스턴스가 하나만 존재하기 때문에 객체가 불필요하게 여러 개 만들어질 필요가 없는 경우에 많이 사용합니다.

 

예를 들면 환경설정, 네트워크 연결처리, 데이터 관리 등등이 있습니다.

 

하지만 멀티 스레드 환경에서 동시에 싱글턴 객체를 참조할 경우 (Producer-Consumer 문제) 원치 않은 결과를 가져올 수 있습니다.

 

 

 

 

참고 : https://www.edwith.org/boostcourse-ios/lecture/16855/

댓글
공지사항