iOS - Singleton(싱글톤)

longlivedrgn·2022년 12월 29일
0

iOS

목록 보기
3/10
post-thumbnail

싱글톤이란?

  • Design Pattern 중 하나이다.
  • 타입 프로퍼티로 선언이 되어있으므로, lazy 하게 initialize가 된다.
  • 특정 용도로 객체를 하나만 생성하여, 공용으로 사용하고 싶을 때 사용하는 디자인 유형
  • 하나의 instance에 어느 클래스에서든 접근 가능하게 하는 것!
  • “이 클래스에 대한 Instance는 최초 생성될 때 딱 한번만 생성해서 전역에 두고, 그 이후로는 이 Instance만 접근 가능하게 하자”할 때 사용이된다.

싱글톤을 언제 사용하면 좋을까?

class UserInfo {
    var id: String?
    var password: String?
    var name: String?
}
  • 위의 코드와 같이 UserInfo를 담는 class를 만든다고 생각해보자. 근데 각 3개의 viewcontroller에서 각각 id, password,name을 입력을 받아 UserInfo 객체를 만들어야된다는 제약조건이 있다면? 각각의 viewcontroller에서 instance를 생성해야되니까 instance가 아래와 같이 3개나 생성이되어야하므로 메모리 낭비가 매우 심하고, 하나의 객체가 아닌 세개의 객체가 생성이되는 것이다

A viewcontroller —> Userinfo(id: “Miro”, password: nil, name : nil)

B viewcontroller —> Userinfo(id: nil, password: “123”, name : nil)

C viewcontroller —> Userinfo(id: nil, password: nil, name : “Kim”)

→ 위와 같이 각각의 Instance가 생성이된다. 이럴 경우, 불필요하게 instance가 생성이되기에 Sington을 사용하여 하나의 Instance를 만들어서 처리하는 게 훨씬 더 효율적이다.

Singleton class 만들기

1) Static 프로퍼티로 instance 생성하기(아래의 Static 정리 확인해보기)

  • static을 이용하여 전역적으로 사용할 수 있도록 한다.(Type Method)
class UserInfo {
    static let shared = UserInfo()

    var id: String?
    var password: String?
    var name: String?
}

2) init 함수 접근제어자를 private으로 지정하기

→ 혹시라도 init 함수를 호출해 Instance를 또 생성하는 것을 막기위해서!

class UserInfo {
    static let shared = UserInfo()

    var id: String?
    var password: String?
    var name: String?

    private init() { }
}

3) Singleton class 접근하는 방법

//A ViewController
let userInfo = UserInfo.shared
userInfo.id = "Sodeul"

//B ViewController
let userInfo = UserInfo.shared
userInfo.password = "123"

//C ViewController
let userInfo = UserInfo.shared
userInfo.name = "Sodeul"

장점

  • 한번의 instance만 생성하므로 메모리 낭비를 막을 수 있다.
  • Singleton Instance는 전역 Instance로 다른 클래스들과 자원 공유가 쉬움
  • 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용

단점

  • singleton class가 너무 많은 일을 하면 다른 클래스의 Instance들 간 결합도가 너무 높아져 (개방 = 패쇄) 객체 지향 설계 원칙에 어긋나진다.
  • 의존성이 높아진다.
  • 멀티 스레드 환경에서 위험할 수 있다. → 멀티 스레드 환경에서는 어쩌다보면 싱글톤 객체가 2개가 생기는 환경이 발생할 수 있다.

Singleton 활동학습

  • 싱글톤 디자인 패턴은 언제 활용하면 좋을까?
    • 특정 용도로 객체를 하나만 생성하여, 공용으로 사용하고 싶을 때
    • 한 instance에 어느 클래스에서든 접근 가능하게 하게 하고싶을 때
  • 싱글턴 디자인 패턴의 장점과 단점은 무엇이 있을까?
    • 장점
      • 한번의 instance만 생성하므로 메모리 낭비를 막을 수 있다.
    • 단점
      • singleton class가 너무 많은 일을 하면 다른 클래스의 Instance들 간 결합도가 너무 높아져 (개방 = 패쇄) 객체 지향 설계 원칙에 어긋나진다.
  • 코코아터치 프레임워크에서 싱글턴이 활용된 사례는 무엇이 있을까?
    • ex) *UserDefaults.standard, FileManager.default, NotificationCenter.default*
  • 싱글턴 디자인 패턴을 구현할 때는 어떤 방식(열거형, 구조체, 클래스 등)을 활용하여 타입을 구현하는 것이 좋을까? 그 이유는?
    • 싱글톤은 하나의 instance를 보장하는 것이기에 class(참조 타입)으로 구현을 하는 게 좋다!

Static은 언제 사용할까?

타입 메소드

우리가 자주 사용하는 instance method는 instance가 생성이되지않으면 사용이 불가하지만, static같이 타입 프로퍼티에 사용 가능한 것은, instance가 없어도 사용이 가능하다.

Class VS Static

  • 둘 다 기본적으로 타입 메소드를 만들어주는 키워드이다.

→ 단, class는 overriding이 가능하지만, static은 불가능하다.

아래와 같이 사용이 가능하다!(인스턴스가 없는데도 불구하고!) → 이걸 가능하게 하는 게 static이다!

class A {
	static func isStatic(){
			print("this is static function")
	}
	class func isClass() {
			print("this is class function")
}

A.isStatic() // "this is static function"
A.isClass() // "this is class function"

타입 프러퍼티

🌱 특정 타입에 속한 프로퍼티로 그 타입에 해당하는 단 하나의 프로퍼티만 생성됩니다. 이 타입 프로퍼티는 특정 타입의 모든 인스턴스에 공통으로 사용 되는 값을 정의할 때 유용하다.(인스턴스 생성 여부와 상관없이 값은 하나) 또한 저장 타입 프로퍼티는 타입자체에 초기자(initializer)가 없기 때문에 항상 ‘초기값’을 지정해서 사용해야 합니다.

  • 인스턴스의 생성없이 생성되는 프로퍼티
struct Apple {
  static var storedTypeProperty = "AAAAA"
  static var computedTypeProperty: Int {
    return 11111
  }
}

print(Apple.storedTypeProperty)  // AAAAA

출처
Swift) 싱글톤 패턴(Singleton Pattern)

Swift: Singleton, 싱글톤 패턴

0개의 댓글