상세 컨텐츠

본문 제목

[iOS] 싱글턴 패턴(in iOS)

IOS/키워드 정리

by 카키IOS 2022. 7. 26. 19:46

본문

이 포스팅은 Swift에서의 싱글턴 패턴을 기준으로 함

 

Swift를 공부하면서 UserDefault라는 인터페이스를 접하게 됐는데 문득 싱글턴 패턴의 개념에대한 이해가 필요하다고 판단되어 이 포스팅을 작성하게 됨.


 

 

1.생성패턴

디자인 패턴은 크게

1.생성 / 2.구조 / 3.행위 패턴으로 나뉘는데 이번에 포스팅할 싱글턴 패턴은 1.생성관련 패턴에 속한다

생성 구조 행위 패턴이라...많이 익숙하다 했는데 과거 자격증 공부를할때...

 

디자인패턴 하면 앞글자를 따서 생(성)구(조)행(위)로 단순 암기식으로 공부했던 기억이 난다(여기서 또 볼줄은..)

디자인 패턴을 깊게 들어가면 GOF, 23개의 디자인 패턴 등등 머리아픈 정보들이 있으니

이런건 나중에 필요하면 알아보도록하고

오늘은 내가 공부하고있는 iOS에서 싱글턴 패턴이 어떻게 활용되는지만 알고 넘어가자.

 

(싱글턴 패턴은 다양한 프로그래밍 언어에서 사용되는 공통 개념이며 각 언어마다 사용법에 대한 차이가 있으니 다른 언어에서 어떻게 쓰이는지 궁금하다면 구글링을 적극 활용해보자.  -> 구글 검색창에 'awesome <프로그래밍언어>'를 검색하면 된다)

 

2.싱글턴 패턴

싱글턴 패턴의 사전적인 의미를 말하자면 '코드를 작성할때 발생하는 문제들을 좀 더 나은 방법으로 작성할 수 있도록 특정한 형식으로 코딩을 하면 좋다라는 기준'을 의미한다.(어지럽네...)

즉 방법론적인 개념을 내포하고 있다. 수학으로 치자면 공식이라 할 수 있다.

이러한 사전적인 의미로 싱글턴 패턴을 이해하기에는 어렵기때문에 싱글턴 패턴 in iOS에 관한 내용을 참고하여 간단한 코드로 설명을 해보겠다.

 

3.싱글턴 패턴 적용

위에서 싱글턴 패턴은 3가지 디자인 패턴중 생성관련 패턴에 속한다고 설명했다.

그중에서도 가장 많이 쓰이는 싱글턴 패턴에 대해서 어떻게 적용하고 활용하는지를 본격적으로 알아보자.

 

객체지향프로그래밍 언어에서 항상 등장하는 클래스와 객체에 대해서 간단히 짚고 넘어가자.

클래스란 일종의 객체를 찍어내기위한 틀, 쉽게말해 빵을 굽는다 치면 빵을 만들어내기 위한 일종의 '빵틀'이라고 생각하면 쉽다

 

빵을 굽는 과정에서 객체는 빵틀에 의해서 만들어진 '빵'이 된다

 

완성된 빵(객체)은 정해진 장소(특정 주소값을 가진 메모리)에 올려지며 판매(사용)를 기다린다

다시말해 자주쓰는 객체를 싱글턴으로 만들어서 지속적으로 참조하는 것을 말한다.

 


Xcode 프로젝트파일을 만들어서 싱글턴 패턴을 이해하기위한 간단한 코드를 작성해보자

//#ViewController.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        let firstObject = MySingleton()

        let secondObject = MySingleton()

 

//#MySingleton.swift

import Foundation

final class MySingleton: NSObject {
    
        
    }
}

NSObject을 상속받는 MySingleton 클래스를 참조하는 두 객체(firstObject / SecondObject)를 생성하고 디버깅을 실행해보자

(디버깅 방법: let secondObject = MySingleton() 의 바로 밑 행에 브레이크 포인트를 걸어 빌드해준다)

 

디버깅 영역에서 po 객체명을 작성하고 엔터를 누른다

여기서 'po'는 메모리의 주소를 얻기위한 키워드이다.

 

싱글턴 패턴을 적용하지 않은 객체의 주소값이다.

이를 통해 얻는 <~c410>과 <~c420>은 firstObject, secondObject 객체가 가진 각각의 메모리 주소를 의미한다.

 

 

그럼 싱글턴 패턴을 적용시킨 객체의 메모리 주소는 어떻게 될까?

Swift의 싱글턴 패턴을 적용하는 방법은 아래 링크를 통해 정보를 얻을 수 있다

 

https://github.com/ochococo/Design-Patterns-In-Swift

 

GitHub - ochococo/Design-Patterns-In-Swift: 📖 Design Patterns implemented in Swift 5.0

📖 Design Patterns implemented in Swift 5.0. Contribute to ochococo/Design-Patterns-In-Swift development by creating an account on GitHub.

github.com

 

위 링크를 통해 들어가보면 Swift에서의 싱글턴 패턴을 알 수 있다.

 

Creational(생성) - 싱글턴

 

위에서 얻은 정보를 토대로 MySingleton 클래스에 싱글턴 패턴을 적용시켜보자

 

//#MySingleton.swift

import Foundation

final class MySingleton: NSObject {
    
    static let shared = MySingleton()
    
    private override init() {
        
    }
}

 

//#ViewController.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let firstObject = MySingleton.shared

        let secondObject = MySingleton.shared
        
        
    }


}

 

아까와 같은 방법으로 디버깅을 하면...

 

 

두 객체의 메모리의 주소가 같아졌다.

아까는 분명 두 개의 객체는 서로다른 메모리 주소값을 가졌지만 싱글턴 패턴을 적용한 두 객체는 같은 메모리 주소를 갖게됐다.

 

이를통해 알 수 있는 사실은 자주 쓰는 객체를 싱글턴으로 만들어서 메모리 사용에 대한 낭비를 막아준다는 것이다.


<참고>

https://www.youtube.com/watch?v=dLRti9htwSw 

 

728x90
반응형

관련글 더보기