[iOS] 싱글톤이 뭐야

Madeline👩🏻‍💻·2024년 2월 4일
0

iOS study

목록 보기
35/50
post-thumbnail

객체

https://velog.io/@maddie/iOS-swift-%EC%9E%85%EB%AC%B8%EC%9D%B4-%EB%81%9D%EB%82%AC%EB%8B%A4%EB%A9%B4-%ED%97%B7%EA%B0%88%EB%A6%B4-%EB%A7%8C%ED%95%9C-%EC%9D%B4%EB%A1%A0-%EC%A0%95%EB%A6%AC

객체는 데이터(속성) + 행동(메서드)를 말하는데, 이게 클래스, 구조체같은 타입으로 정의된다.
그리고 반대로 클래스나 구조체와 같은 타입을 통해 만들어지는 인스턴스를 객체라고 한다.
특히 클래스는 참조 타입으로, 인스턴스를 사용할 때에 참조를 전달하기 때문에, 하나의 인스턴스를 공유한다. 그래서 싱글톤 패턴을 사용할 때 쓰이는데, 싱글톤 패턴이 뭔데?

싱글톤이 뭐야

특정 클래스의 인스턴스를 1개만 생성하는 걸 보장!하는 디자인 패턴이다. 그러니까 클래스에 대한 인스턴스를 생성할 때 딱 한번만 만들어서 전역에 두고, 이 인스턴스만 접근 가능하게 하는 거다.

예를 들어, 설정 정보를 관리하는 객체나 네트워크 연결을 관리하는 객체 같은 경우. 이런 객체는 앱 전체에서 공유되어야 하고, 오직 하나만 있어야 한다.

그러니까 싱글톤은 마을에 우체국을 세우는 것과 비슷하다. 마을 사람들이 편지를 보내거나 받을 때 모두 이 우체국을 사용해야 한다. 마을에 우체국이 여러개 있으면 혼란스러우니까, 이 마을에는 우체국이 딱 하나 있고, 모든 사람들이 이 우체국을 공유한다.

장점

싱글톤은 앱 전체에서 공유하는 자원이나 서비스를 한 곳에서 관리할 수 있다. 또 인스턴스 하나만 사용하므로 메모리를 세이브할 수 있고, 전역 인스턴스로 쉽게 데이터를 공유할 수 있다.

마을 사람들이 편지 보낼때마다 우체국을 만들 필요가 없어서 시간과 자원을 절약할 수 있다.
또 어디서든지, 누구나 우체국의 위치를 알고 있어서 서비스를 이용하기 편리하고, 한 곳에서 이루어지기 때문에 관리가 용이하다.

단점

싱글톤은 앱 전체에 걸쳐 전역으로 선언되기에 코드가 이해하기 어려워질 수 있다. 또 테스트가 어렵고, 의존성 관계가 불투명해질 수 있다.

마을에 우체국이 하나 뿐이라면, 모든 처리를 한 곳에서 해야 해서, 때로는 시간이 오래걸릴 수도 있다. 또 다른 방식으로 서비스를 이용하고 싶어도, 모든 사람이 같은 서비스를 이용해야 한다.
마을 사람들이 이 우체국에만 의존하게 되면, 우체국에 문제가 생겼을 때 모두가 영향을 받게 된다.

class MySingleton {
    static let shared = MySingleton()

    private init() {
        // 초기화 코드
    }

    func doSomething() {
        // 싱글톤 객체가 할 일
    }
}

여기에서 MySingleton 클래스는 shared라는 속성을 통해 접근할 수 있다.
이 속성은 MySingleton 객체를 가리키기 때문에, 앱 안에서 어디서든지 MySingleton.shared를 통해 접근하면 항상 같은 객체에 접근한다.
private init()은 다른 곳에서 클래스를 복제하거나 새로 만들 수 없도록 막는다. 그래서 어디서나 같은 클래스를 사용할 수 있다.

예를 들어, 우리 앱에 설정 정보를 관리하는 싱글톤 객체가 있다고 해보자.
이 객체를 통해서 사용자가 설정한 언어나 테마 같은 정보를 저장하고, 앱의 어디서든 같은 정보를 쉽게 가져올 수 있다.

SettingsManager.shared.setLanguage("한국어")
let currentLanguage = SettingsManager.shared.getLanguage()

이렇게 싱글톤 패턴을 사용하면, 앱 전체에서 하나의 객체를 공유하여 사용할 수 있다.

싱글톤 패턴 코드

  1. 싱글톤 패턴 구현 코드 퀴즈

아래 Swift 코드 조각 중, 올바르게 싱글톤 패턴을 구현한 예시는 어떤 것인가요?
어떤 코드가 싱글톤 패턴을 올바르게 구현하고 있나요?

A.

class AppManager {
    static let shared = AppManager()
    private init() {}
}

B.

class AppManager {
    var instance = AppManager()
    init() {}
}

C.

class AppManager {
    static var instance: AppManager?
    private init() {}
}

=> 정답은 A!
A옵션에서 AppManager 클래스는
static let shared = AppManager()를 사용하여 싱글톤 인스턴스를 생성하고,
private init()을 통해 외부에서 인스턴스를 임의로 생성할 수 없도록 하여 싱글톤 패턴을 올바르게 구현하고 있다.

  1. 싱글톤 사용 코드 퀴즈:

아래 Swift 코드가 싱글톤 패턴을 사용하는 Logger 클래스의 인스턴스에 접근하여 로그 메시지를 기록하는 올바른 방법은 무엇인가요?

class Logger {
    static let shared = Logger()
    private init() {}
    
    func log(message: String) {
        print(message)
    }
}

=> 정답은

Logger.shared.log(message: "App started")

아래와 같은 코드는 왜 안될까?

let instance = Logger()
instance.shared.log(message: "Log Message")

왜냐면 Logger 클래스의 생성자가 private으로 선언되어있어서 직접 인스턴스를 생성할 수 없는거다~

profile
Major interest in iOS 🍀 & 🍎

0개의 댓글