본문 바로가기

Tech/iOS

[iOS]Day 29 - Singleton Pattern

728x90

싱글이다

 


Singleton Pattern

자기 자신의 인스턴스를 type property 형태로 저장하여 별도의 인스턴스 생성없이 공용으로 사용할 수 있다

class 내에서 보통 인스턴스명으로  shared, standard를 많이 사용함

왜 쓰는가?

인스턴스를 사용할 때 마다 남발하면 메모리의 사용량이 증가할 수 밖에 없다

싱글톤 패턴은 하나의 인스턴스만 메모리에 올려놓고 필요할 때 꺼내 쓰기 때문에 메모리 낭비를 줄일 수 있다

 

주의점

싱글톤 패턴을 사용할 때 private init() {} 을 이용하여 초기화 구문이 동작하지 않게 해주어야 한다.

싱글톤 패턴을 만들어 놓은 파일내에서가 아닌 다른 파일에서 동일한 인스턴스를 만들면 싱글톤 패턴 자체가 깨진다

처음에는 왜 쓰지? 했다가 요즘에는 없으면 왜 안쓰지? 라는 생각이 드는 싱글톤 패턴이다

 

class UserDefaultsHelper {

    let userDefaults = UserDefaults.standard
    private init() {}
    
    enum Key: String {
        case nickname
        case age
    }
    
    var nickname: String {
        get {
            
            UIApplication.shared
            FileManager.default //데이터에 대한 동기화 관점을 활용하기 위해서 singleton Pattern 활용

            return userDefaults.string(forKey: Key.nickname.rawValue) ?? "대장"
        }
        set {//연산 프로퍼티 parameter
            userDefaults.set(newValue, forKey: Key.nickname.rawValue)
        }
    }
    
    var age: Int {
        get {
            return userDefaults.integer(forKey: Key.age.rawValue) //bool도 기본값이 있다 integer는 기본값이 0
        }
        set {
            userDefaults.set(newValue, forKey: Key.age.rawValue)
        }
    }
    
}

Extension에서 Protocol 활용

화면전환 구현을 할 때 화면전환 구현을 하는 모든 파일 마다 identifier를 설정하여 호출하는 방식으로 생성했었다.

하지만 identifer를 명시하는 Protocol을 만든 후 identifer 호출이 필요한 Controller에 Extension을 활용하여 Protocol을 채택하면 더이상 identifier를 파일마다 설정해주는 수고?는 덜하게 된다

protocol ReusableViewProtocol {
    static var reuseIdentifier: String { get }
}

extension UIViewController: ReusableViewProtocol {
    static var reuseIdentifier: String { 
         String(describing: self)
    }
}

extension UITableViewCell: ReusableViewProtocol {
    static var reuseIdentifier: String {
        String(describing: self)
    }
    
    
}

Extension 내에는 메모리 공간을 차지하는 저장프로퍼티는 사용하지 못 한다


Enum vs Struct

저장 프로퍼티를 만들 때 Enum을 사용해야할까? Struct를 사용해야할까?

별차이 없지 않나?

최근들어 느끼는데 컴퓨터에서는 별차이 없는건 없고 쓰는 이유가 다 있다

 

위에서 Singleton Pattern을 설명할 때 언급했지만 인스턴스 남발은 좋지 않다

Enum은 위에서도 말했듯 저장프로퍼티를 사용하지 못하고 인스턴스 생성이 불가능하다 

 

다들 알다싶이 Struct는 인스턴스 생성이 가능하다 (Private init(){}을 쓰면 되긴 하지만)

인스턴스 생성 방지의 관점에서 쓰는 것이 불가능한 것과 쓸수는 있지만 쓰지 않는 것의 차이라고  보면 된다 (안 vs 못)


Enum case vs Enum static

case는 대문자를 사용하지 못하고 중복될 수 없기 때문에 제약이 되는 두 경우 Enum 내에서 타입 저장 프로퍼티를 사용하는 것이 더 좋다

'Tech > iOS' 카테고리의 다른 글

[iOS] Day30 - Rest API  (0) 2022.08.02
[iOS] Day29 - Api 통신  (0) 2022.08.01
[iOS] Day 26 - Custom Font  (0) 2022.07.29
[iOS]Day 26 - Notification  (0) 2022.07.29
[iOS] Day 25 - Protocol  (0) 2022.07.28