이 포스팅은 Swift에서의 싱글턴 패턴을 기준으로 함
Swift를 공부하면서 UserDefault라는 인터페이스를 접하게 됐는데 문득 싱글턴 패턴의 개념에대한 이해가 필요하다고 판단되어 이 포스팅을 작성하게 됨.
디자인 패턴은 크게
1.생성 / 2.구조 / 3.행위 패턴으로 나뉘는데 이번에 포스팅할 싱글턴 패턴은 1.생성관련 패턴에 속한다
생성 구조 행위 패턴이라...많이 익숙하다 했는데 과거 자격증 공부를할때...
디자인패턴 하면 앞글자를 따서 생(성)구(조)행(위)로 단순 암기식으로 공부했던 기억이 난다(여기서 또 볼줄은..)
디자인 패턴을 깊게 들어가면 GOF, 23개의 디자인 패턴 등등 머리아픈 정보들이 있으니
이런건 나중에 필요하면 알아보도록하고
오늘은 내가 공부하고있는 iOS에서 싱글턴 패턴이 어떻게 활용되는지만 알고 넘어가자.
(싱글턴 패턴은 다양한 프로그래밍 언어에서 사용되는 공통 개념이며 각 언어마다 사용법에 대한 차이가 있으니 다른 언어에서 어떻게 쓰이는지 궁금하다면 구글링을 적극 활용해보자. -> 구글 검색창에 'awesome <프로그래밍언어>'를 검색하면 된다)
싱글턴 패턴의 사전적인 의미를 말하자면 '코드를 작성할때 발생하는 문제들을 좀 더 나은 방법으로 작성할 수 있도록 특정한 형식으로 코딩을 하면 좋다라는 기준'을 의미한다.(어지럽네...)
즉 방법론적인 개념을 내포하고 있다. 수학으로 치자면 공식이라 할 수 있다.
이러한 사전적인 의미로 싱글턴 패턴을 이해하기에는 어렵기때문에 싱글턴 패턴 in iOS에 관한 내용을 참고하여 간단한 코드로 설명을 해보겠다.
위에서 싱글턴 패턴은 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'는 메모리의 주소를 얻기위한 키워드이다.
싱글턴 패턴을 적용하지 않은 객체의 주소값이다.
이를 통해 얻는 <~c410>과 <~c420>은 firstObject, secondObject 객체가 가진 각각의 메모리 주소를 의미한다.
그럼 싱글턴 패턴을 적용시킨 객체의 메모리 주소는 어떻게 될까?
Swift의 싱글턴 패턴을 적용하는 방법은 아래 링크를 통해 정보를 얻을 수 있다
https://github.com/ochococo/Design-Patterns-In-Swift
위 링크를 통해 들어가보면 Swift에서의 싱글턴 패턴을 알 수 있다.
위에서 얻은 정보를 토대로 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
[Swift] 다른 파일의 메서드 호출하기 (0) | 2022.08.13 |
---|---|
[iOS] Rest_API (0) | 2022.08.10 |
[Swift] D-day 계산을 위한 핵심 코드 설명 (0) | 2022.07.16 |
[Swift]시작 storyboard 파일 바꾸기 (0) | 2022.07.12 |
[Swift]체크리스트 (UIKit, UIViewController, UIView, @IBOutlet, @IBAction) (0) | 2022.07.06 |