[Swift 디자인 패턴] Singleton Pattern (싱글턴) - 디자인 패턴 공부 6
안녕하세요 Pingu입니다.🐧
지난 글에서는 Prototype Pattern에 대해 알아봤는데요, 이번 글에서는 또 다른 Creational Pattern 중 하나인 Singleton Pattern(싱글턴)에 대해 알아보도록 하겠습니다!
싱글턴 패턴이란?
싱글턴 패턴은 하나의 프로그램에서 단 하나의 객체만 있어도 되는 경우 해당 객체를 한 번만 생성하고, 모든 곳에서 접근 가능하게 해주는 패턴입니다.
싱글턴 패턴을 사용할 객체는 한 번만 생성되어야 하며 프로그램의 모든 곳에서 접근이 가능한 전역 변수여야 합니다. 한 번만 생성되어야 하므로 생성자를 private 접근 수준으로 만들어야 하고 이를 생성하기 위해서 static 생성 메서드를 만들고 static 변수에 할당해주면 됩니다.
저는 iOS 개발을 하다 싱글턴 객체를 많이 발견할 수 있었는데요, 예를 들어 UIApplication의 싱글턴 객체인 shared라던가 UIDevice.current 객체 등 정말 다양한 곳에서 사용하고 있습니다.
싱글턴 패턴은 언제 쓰나요?
싱글턴 패턴은 어떤 클래스의 인스턴스가 두 개 이상 존재하면 문제가 있거나 뭔가 논리에 맞지 않을 때 사용합니다. 예를 들어 DB를 관리하는 객체라던가 File Manager 객체같이 굳이 두 개 이상 존재할 필요도 없을 때 싱글턴 패턴을 사용할 수 있어요.
싱글턴 패턴의 결과
- 하나의 인스턴스만 존재하는 것을 보장할 수 있습니다.
- 한 번의 생성만 필요하기 때문에 불필요한 코드를 줄일 수 있고 메모리를 절약할 수 있습니다.
- 싱글턴 패턴은 남용하기 쉬운 패턴으로 주의해서 사용해야 합니다. 전역 객체에 상태가 저장되어 있다면 테스트 순서에 문제가 생길 수 있습니다. 또한 굳이 싱글턴 패턴을 사용하지 않아도 되는 데 사용하는 경우도 지양해야 합니다.
예제
그럼 이제 Swift로 간단하게 싱글턴 패턴을 구현해보겠습니다.
이번 코드에서는 DB를 관리하는 DBManager 객체라는 녀석을 싱글턴 객체로 간단하게 만들어보겠습니다.
class DBManager {
// Singleton Instance
static let shared = DBManager()
private var database: [String]
private init() {
database = []
}
public func addData(data: String) {
self.database.append(data)
}
public func deleteData(data: String) {
if let index = self.database.firstIndex(of: data) {
self.database.remove(at: index)
} else {
print("데이터가 없습니다.")
}
}
}
위와 같이 DBManager 클래스를 만들고 static 변수에 자기 자신을 생성하여 할당합니다.
또한 DBManager의 생성자를 private으로 선언한 것을 볼 수 있는데요, 이 때문에 클래스 내부에서 말고는 객체 생성이 불가능하게 만들어 전체 프로그램에서 해당 객체가 단 하나만 존재할 수 있는 것을 보장해줍니다.
예를 들어 일반적으로 생성하려고 한다면..
이렇게 생성자의 접근 수준이 private이라며 생성할 수 없다고 합니다.
따라서 DBManager를 사용하기 위해서는 클래스의 static 변수로만 사용이 가능합니다.
따라서 위와 같이 사용해주면 프로그램의 어디서든 동일한 객체에 접근할 수 있게 됩니다.
이렇게 싱글턴 패턴에 대해 알아보고 간단하게 구현도 해봤습니다.
혹시라도 틀린 부분이 있다면 알려주시면 감사하겠습니다.😞
전체 코드는 여기에서 볼 수 있습니다.
이번 글을 끝으로 GoF의 생성 패턴을 모두 공부했어요.
생성패턴 중에서는 이번 글에서 알아본 싱글턴 패턴이 가장 익숙해서인지 이해하기 쉬웠던 거 같습니다.
다음 글부터는 Structural Pattern (구조 패턴)에 대해 알아보도록 하겠습니다.
감사합니다.