iOS - 싱글톤

영점·2022년 10월 4일
0

iOS

목록 보기
1/1

프로퍼티를 정리하며 싱글톤 이야기가 나왔기에..
머릿속을 정리하고자 겸사겸사 정리하게 되었습니다.

여는장

먼저 싱글톤의 정의입니다.

The singleton pattern is a software design pattern that restricts the instantiation of a class to one “single” instance.

위를 번역하자면 싱글톤 패턴은 클래스의 인스턴스화를 하나의 "단일" 인스턴스로 제한하는 소프트웨어 디자인 패턴이다 라고 합니다.

간단하게 이야기 하자면 특정 용도로 객체를 "하나"만 생성하여, 공용으로 사용하고 싶을 때 사용하는 디자인 패턴을 말합니다.

막상 이렇게 말하면 잘 모르겠지만 iOS 개발을 하다보면 몇번 마주쳤을 것입니다.
예시를 들자면 URLSession.shared가 있습니다.

let dataTask = URLSession.shared.dataTask(with: URLRequest(url: url!)) { _, _, _ in 
	//code in here.
}

이외에도 iOS에서 몇몇 기능들에서 싱글톤을 사용하고 있습니다.

직접 만들기

본론으로 들어가서.. 싱글톤을 우리가 직접 만들 수도 있습니다.

class Samples {
    static let shared = Samples()
    
    private init() {}
}
class Samples {
    static let shared = Samples()

    var id: Int?
    var password: String?
    var name: String?
    
    private init() {}
}

static 을 이용해 전역적으로 사용할 수 있도록 만들고,
혹시라도 Init을 호출해 인스턴스를 또 생생하는 것을 막기 위해,
init() 함수 접근 제어자를 private로 지정해줍니다.

이렇게 싱글톤이 만들어졌습니다.
해당 클래스는 위의 URLSession과 마찬가지로 shared란 프로퍼티를 통해 접근합니다.

let test = Samples.shared
test.id = 0
test.password = "qwertz04@"
test.name = "zero"

그럼 언제 쓰는가

싱글톤 패턴은 DBCP(DataBase Connection Pool)처럼
공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용합니다.

싱글톤 패턴은 장점이 많은 만큼 단점도 비례합니다.
먼저 장점은 이렇습니다.

메모리를 단 한번만 사용한다.

싱글톤을 이용하면 메모리를 단 한번만 사용하기 때문에 메모리 관리가 편합니다.

객체 접근 시간이 줄어든다.

싱글톤을 한 번 만들어두기만 하면 다시 메모리를 할당하고 초기화(init)하는 과정이 줄어드니
매번 객체를 만들 때보다는 빠릅니다.

전역 범위에서 상태, 데이터 전달이 쉬워진다.

static이라서 어디서든 접근할 수 있기 때문에 어떤 상태를 표시하거나, 데이터를 공유하기에 적절합니다.
단 하나의 객체만 있고, 잘 신경써서 동시성 문제가 생기지 않도록 짜기만 한다면 걱정 없이 상태나 데이터를 전달할 수 있다.

장점만 봤을때는 "와 그럼 싱글톤 완전 좋네 무조건 써야겠다" 싶지만 꼭 그런것도 아닙니다.
단점이 존재하기 때문입니다.

테스트가 힘들다.

위의 싱글톤 예시처럼 init 을 private 로 설정해 유일성을 보장하는 경우가 많습니다.
의도는 좋지만 이렇게 생성을 제한해버리면 테스트용 Mock 객체를 만들어내기 어려워집니다.
이렇게 되면 관련된 로직을 테스트하기 어려워지고, 테스트 코드가 중요한 경우에는 싱글톤이 오히려 곤란한 존재가 될 수 있습니다.

의존성

싱글톤의 특성이 ‘여기저기’서, ‘쉽게’ 접근할 수 있는 터라,
Singleton Instance가 너무 많은 일을 하거나, 많은 데이터를 공유시킬 경우 다른 클래스의 Instance 간의 결합도가 높아져 "개방=폐쇄" 원칙을 위배하게 됩니다.

닫는장

따라서 싱글톤 객체를 무조건적으로 쓰지 말고 쓰기 이전에 많이 고민을 해보아야 합니다.
고민했을때 사용하는 것이 좋다고 생각하면 최대한 동시성에 주의하여 설계하도록 해야합니다.
정말 딱 필요한 것들만 가지고 있음으로써 필요 이상으로 다른 객체들에게 영향을 주지 않도록 해야 합니다.

정말 고민된다고 하면 해당 포스트를 참고해봐도 괜찮을 듯 합니다.
GCD도 추후에 포스트..😅

https://medium.com/@jang.wangsu/swfit-thread-safety-한-싱글톤-사용은-75c43e567acf

참고자료입니다.

https://babbab2.tistory.com/66
https://medium.com/hcleedev/swift-singleton-싱글톤-패턴-b84cfe57c541

profile
일단 배운내용은 적어두기

0개의 댓글