본문 바로가기

iOS/UIKit

[Swift] Singleton Pattern

이번에는 싱글톤 패턴에 대해서 알아보도록 하겠습니다!

싱글톤 패턴은 디자인 패턴의 일종이잖아여??

디자인 패턴이라 하면 코딩을 할때 어떤식으로 짤지??에 대해서 반복되는 문제들을 해결하기 위한 일종의 패턴입니다!

→ 소프트웨어 디자인 과정에서의 문제점을 해결하기 위한 해결책!

한번쯤 쫘아악 정리해서 알아봐야지 생각하고 있었는데 이게 이론적인 부분을 코드를 디자인할때 적용하는거라 아무리 이론을 공부해도 실제로 써보지 않으면 또 금새 까먹을꺼 같아서 미루고 있었거든여 (귀찮아서 아님)

그러던 중!! 이번에 과제를 하면서 뷰 간에 데이터를 어떻게 넘겨줄지 찾아보다가.. 싱글톤 패턴을 이용하게 되어서 한번 정리해보기로 했습니다!

싱글톤 패턴이 몬데요??


  • 야곰 센세의 설명

싱글턴 패턴을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.

음.. 그러니까.. 클래스에 인스턴스를 하나 만들어서.. 이거를 전역 접근할 수 있도록 생성해서 쓰는겁니다!

  • 메모리를 한번 할당(static) 해서 그 메모리에 인스턴스를 할당해서 사용!
  • 여러번 호출이 되더라도 실제 사용되는 객체는 최초의 생성자가 만든거 하나!!

⇒ 단 하나의 인스턴스(유일 객체)만 사용!!!!!!!!!!!!!!!!!

  • static 전역 변수로 선언하기 때문에 첫 싱글톤 인스턴스를 생성하기 전까지 메모리에 올라가지 않음
    • static 을 이용하면 프로퍼티는 지연생성(lazy) 됨!
  • 싱글톤으로 생성된 인스턴스는 임의로 메모리 해제를 하지 않는다면 프로그램 종료시까지 유지됨
  • 싱글톤 객체는 하나의 객체만을 필요로 하므로 클래스 생성자에 private으로 설정해 생성되는 것을 막아야 함
    • 의도적으로 싱글톤 객체를 여러번 생성할 것이 아니라면

이걸 언제, 왜 쓰나요??


  • 싱글톤 패턴을 쓰는 이유는 뭘까요?
  1. 고정된 메모리 영역을 얻어서 하나의 인스턴스만 씀 → 메모리 절약!
  2. 싱글톤으로 만든 인스턴스는 전역 인스턴스임 → 데이터 공유가 쉬움
  3. 객체 로딩 시간이 줄어듦 → 성능이 좋아져요!
  • 언제 써요 그럼 ㅇㅅㅇ
  1. 앱 전체에 걸쳐 유일한 객체를 만들어야 할때!
    1. 전역적으로 접근이 가능한 유일한 객체이므로
    2. 여러 객체가 동일 객체로부터 상태 정보를 받아야 할 때!!!
    → 앱 전반에 걸쳐 공유되어야 하는 데이터들이 있는 경우가 되겠습니다

UserDefaults, URLSession 이나 NotificationCenter 등이 대표적인 싱글톤 패턴의 예시임!

어케 쓰면 될까요?


다음과 같은 클래스가 있다고 가정했을 때, products 배열의 요소를 버튼을 통해서 carts 뷰에 넣고 싶고, 이 두 배열은 서로다른 뷰에서 보이고 있습니다!

만약 싱글톤 패턴을 쓰지 않는다면 화면이 전환될때마다 ProductModel을 일일히 다 넘겨줘야됩니다.

 

이때 static 타입의 인스턴스를 생성하게 된다면 전역적으로 사용할 수 있는 ProductModel 객체를 생성한 겁니다!! (이름은 보통 shared로 한다고 함)

이를 통해 모든 뷰에서 하나의 객체를 이용해서 데이터의 접근이 가능합니다!

또한 이니셜라이저를 private으로 하여 더 이상의 싱글톤 객체가 생성될 수 없도록 합니다!!

이렇게 선언을 한다면 원래라면 일일히 각 뷰에서 ProductModel을 선언하고, 데이터를 넘겨주고 해야하지만

ProductModel.shared.products 뭐 이런식으로 모든 뷰에서 접근이 가능해집니다!

옴청 편리하쥬?

싱글톤 패턴의 장, 단점


사실 위에서 다 작성한 내용인데 한번 더 정리해 볼게여

장점

  1. 유일한 객체를 만들어서 다양한 객체들에게 공유되는 객체를 만들 수 있
  2. 재사용이 가능하여 메모리 낭비를 방지

단점

  1. 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 "개방-폐쇄 원칙" 을 위배하게 된다. (=객체 지향 설계 원칙에 어긋남)

→ 수정 및 테스트가 어려워짐

따라서 꼭!! 필요한 경우가 아니라면 지양하고, 항상 적절하게 사용하는게 좋을듯 합니당

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

UIKit Delegate 패턴 뿌수다 부서지기...  (1) 2023.11.01
UIKit ViewController Lifecycle  (1) 2023.07.23
UIKit TableView (1)  (0) 2023.07.06