티스토리 뷰

swift

[swift] Singleton 알아보기

순진이 2022. 3. 14. 12:00

지난 번 UserDefaults를 공부하면서 했던 약속,,,(아무도 안 보지만,,) 나와의 약속,,,

Singleton에 대한 공부입니다.

스따뚜~🤡


Singleton은 한 마디로 정리하자면, "유일하게 존재하는 객체"에요.

※객체라는 말은 class의 인스턴스에만 적용되는 말인데요, struct의 인스턴스에는 쓰지 않아요.

 

 

Singleton은 static let 키워드를 붙여서 만들어요. 엄밀히 말하자면 type property라고 할 수 있져.

아래 Color 클래스를 한 번 볼까요?

class Color {
    var color = "Blue"
}

let myColor1 = Color()
print(myColor1.color) // Blue

let myColor2 = Color()
myColor2.color = "Red"
print(myColor2.color) // Red
print(myColor1.color) // Blue

 

Color 클래스의 객체 myColor1과 myColor2를 만들어줍니다.

myColor1과 myColor2는 각자가 메모리 힙 영역에 올라가겠져?

myColor2의 색상을 변경해도 myColor1의 색상에는 영향이 없고 여전히 Blue인거져.

 

 

그렇지만, 이렇게 여러개의 객체를 찍어내면 안되는 경우에는 어떨까요?

여기 저기서 찍어낸 객체들이 여러개가 존재하면서 혼란이 생길 수 있겠져?

객체마다 힙 영역에 올라가면, 메모리 낭비도 엄청날 거에요.

 

 

예를들어, 지난 번에 UserDefaults를 공부하면서 음악 On/Off, 최고 점수, 볼륨 등을 저장하기에 적합하다고 했잖아여?!

근데 그 객체가 계속 생성되다보면 안되겠져? 더군나다 저런 속성은 여러개 있는 게 더 이상하구요.

 


Singleton 만들기

class Car {
    var color = "Blue"
    //⭐️싱글톤
    static let shared = Car()
}

싱글톤을 만드는 것은 어렵지는 않은데요.

클래스를 만들어준 후, 그 클래스의 객체를 타입 속성으로 만들어주면 됩니다.

 

 

보통 shared라는 키워드를 많이 쓰는 것 같아요.

아마 공유한다는 뜻이겠져?

 

 

이제 이 싱글톤의 속성을 바꿔봅니다요.

let firstCar = Car.shared
print(firstCar.color) // Blue

//만약 속성 color를 바꾸면?
firstCar.color = "Red"
print(firstCar.color) // Red

//또 다른 객체를 찍어내면?
let secondCar = Car.shared
print(secondCar.color) //Red

firstCar 객체를 찍어낼 때, 아직 Car의 색은 Blue에요.

근데 제가 firstCar의 속성을 중간에 Red로 바꿔줍니다.

 

 

그리고 secondCar를 싱글톤으로 찍어내면?

위에서는 상관없이 Blue였죠?

근데 이번에는 Red입니다. 유일한 객체 shared를 바꾸고 있는거라서 어디든 반영되거든요.

 

 


let thirdCar = Car()
print(thirdCar.color) //Blue

물론 싱글톤이 아닌 그냥 class Car의 객체도 언제든지 찍어낼 수 있어요.

여전히 그 값은 Blue구요. (Red가 아님)

 

 

그런데 만약 이런 새로운 객체까지 못 찍게 하려면 어떻게 할까요? 아래와 같은 생성자를 선언해주면 됩니다요.

class Car {
    static let shared = Car()
    var color = "Blue"
    
    //⭐️⭐️⭐️객체 생성 막기
    private init() { }
}

 

다시 thirdCar의 객체를 생성하려고 하면?

위에 같은 에러 메시지가 뜨는데영 ㅎㅎㅎ 대충 private 키워드가 붙어서 생성이 안된다는 고런 얘기 같아요!

 


이런 싱글톤은 애플에서도 만들어서 사용하는데요.

이런 놈들이 있대요. (앨런님 강의 참고)

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

 

(tmi)

저는 프로젝트를 만들면서 아직 1번 사용해봤는데요.

피자 주문 앱을 만들 때, 주문한 피자 종류와 수량 등을 싱글톤을 만들어서 전부 저장했었어요.

뷰컨이 여러개라서 다양한 뷰컨에서 객체를 늘리다보니까, 관리가 안 되더라구요.

 


싱글톤은 막상 사용하려고 하면 생각이 안나는 것 같아여,,, 실력이 문제겠져,,ㅎㅎ,,

오늘도 틀린 게 있으면 알려주십셔!! 슨배님덜! 많이 배우겠습니당!

'swift' 카테고리의 다른 글

[swift] Tuple  (0) 2022.03.22
[swift] 계산 속성(computed property)  (0) 2022.03.21
[swift] Result Type 알아보기  (0) 2022.02.03
[swift] 고차함수 1 - map  (0) 2021.12.28
[swift] CaseIterable protocol  (0) 2021.12.11
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크