Search
Duplicate
🧸

싱글톤 디자인패턴(Singleton Design), static과 타입프로퍼티(type Property)

간단소개
접니다.
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Swift
Scrap
태그
9 more properties
UIApplication.shared 라는 코드가 뭔지 몰라서 찾아보니 싱글톤이라는 디자인 패턴이며, 이것에 대해서 뭔지 몰라서 찾아보게 되었다.

싱글톤 패턴이란?(what is Singleton design pattern)

싱글톤이란, 단 하나의 인스턴스만을 생성해서 사용하는 디자인 패턴을 의미한다.
당연히 이러한 디자인 패턴을 이용하는데에는 다 장점이 있겠죠?
싱글톤 디자인 패턴, 하나의 User Info 라는 전역 인스턴스가 존재한다.

싱글톤의 장점

1.
메모리 측면 : 단한번의 인스턴스가 생성되기 때문에, 메모리 관리가 편하고, 모종의 이유로 메모리가 해제되지 않는 memory leak 부분에서도 자유롭다. 또한 객체 접근시간이 줄어든다.
2.
정보 공유 측면 : 하나의 인스턴스가 전역적으로 사용되기 때문에, 다양한 클래스에서 해당 인스턴스를 접근할수 있게 된다. 즉 하나의 클래스 인스턴스가 가지고 있는 프로퍼티나 메소드를 다양한 클래스에서 쉽게 접근 가능하다는 점이다.

싱글톤의 단점

1.
구체클래스에 의존하게 되어서, ocp, dip 를 위반할 가능성이 높다.
구체 클래스 : new를 통해서 인스턴스 생성이 가능한 클래스  추상클래스 : new를 통해서 객체 생성불가
ocp(개방 폐쇠 원칙) : 소프트웨어 엔티티는 확장에 대해서는 열려있어야 하지만, 변경에 대해서는 닫혀있어야 한다. 즉 기존 코드를 변경하지않으면서 ( 기존 엔티티를 건들지 않으면서, 기능을 추가할수 있어야 한다는 것이다. )
dip(의존성 역전 원칙) : 추상화에 의존해야하며, 구체에 의존하면 안된다는 원칙
→ 그런데 싱글톤의 경우에는 하나의 구체클래스에 의존하고 있으며, 변경을 할때도 해당 구체에 대한 직접적인 변경을 할수 있기 때문에 이 두가지 원칙에 대한 위배 가능성이 존재한다.
2.
테스트가 어렵다. 싱글톤 디자인패턴은 하나의 인스턴스가 데이터를 공유하고 있기 때문에, 데이터와 모델의 격리가 불가능하다. 따라서 테스트가 온전하게 수행되기 어렵는 단점이 있다.
싱글톤은 멀티스레드 환경에서 동시에 singleton 객체를 생성하면, 여러개의 객체가 생성되고 이는 Thread-safe(여러스레드가 접근했을때 문제가 발생하지 않는다)하지 않다.

스위프트에서의 Singleton?

스위프트는 static 키워드를 사용하여 타입프로퍼티로 생성하게 되면, 이러한 thread-safe한 문제에서 벗어날수 있다.

static, 타입프로퍼티에 대해서

static은 타입프로퍼티와 타입메소드를 지정하는 키워드이다.
타입프로퍼티란, 인스턴스 프로퍼티와 다르게, 그 타입에서 그대로 사용할수 있는 프로퍼티를 의미한다.
코드를 보면 이해가 쉬운데
이렇게 static키워드를 사용하면 타입프로퍼티가 되는데, 이처럼 타입프로퍼티가 되면 인스턴스를 생성하더라도 인스턴스에서 프로퍼티를 접근할수가 없고, 타입 그 자체로만 프로퍼티에 접근이 가능하다. (메소드에서도 동일)

특징

이러한 static키워드를 통해서 만든 타입 프로퍼티, 타입메소드는 단 한번 해당 타입이 메모리에 올라갔을때 부터는 계속해서 메모리를 공유하는 방법이다. 따라서 인스턴스와 상관이 전혀 없으며, 인스턴스를 생성하는 시점에서 이니셜라이즈 해줄수 없기 때문에, 항상 초기값을 가져야 한다는 특징을 가진다.

연산 타입 프로퍼티 오버라이드(type method override)

연산 타입프로퍼티 또한 오버라이드가 가능한데 static키워드 그 자체로는 오버라이드가 불가능한 형태이다.
따라서 class키워드를 통해서 오버라이드가 가능한 타입 프로퍼티라는것을 선언할수 있다.
static 연산 프로퍼티에서는
class 키워드의 연산프로퍼티는 오버라이드가 된다.
class 키워드를 이용한 타입메소드 makeNewAge

싱글톤에서의 static 키워드

shared라는 타입 프로퍼티(전역변수) 로 해당 클래스의 인스턴스를 넣어주엇다.
해당 클래스의 인스턴스를 클래스 내부에 shared라는 변수에 만들어두고, private키워드로 이니셜라이저를 접근제어 해두면, 다른 클래스에서 해당 인스턴스를 선언할수 없기 때문에, 다른 스레드나 클래스에서 다른 인스턴스가 생성될 가능성이 없기 때문에 thread-safe하다.
위의 방법처럼 Uno.shared를 통해서 전역적으로 선언된 타입프로퍼티에 접근하게 되면 단 하나의 인스턴스에 접근하게 되는것이다. 이를 통해서 싱글톤 패턴을 만들수 있게 된다.

스위프트에서 싱글톤

let screen = UIScreen.main let userDefault = UserDefaults.standard let application = UIApplication.shared let fileManager = FileManager.default let notification = NotificationCenter.default
Swift
복사
이런 키워드를 통해서 싱글톤을 사용하고 있다.

정리

싱글톤이란 데이터 공유와 메모리적 측면의 이점을 위해 전역적으로 사용하는 하나의 인스턴스를 사용하는 디자인 패턴이다.
이러한 싱글톤 디자인 패턴을 이용할때는, 다중스레드를 이용할 경우, 인스턴스가 스레드별로 여러개가 생성되는것을 주의해야한다.
스위프트에서는 이러한 thread-safety에 관한 문제를, static키워드 (타입프로퍼티)를 통해서 전역적으로 생성함과 동시에 lazy키워드 처럼 메모리에 올라가는 시점에 인스턴스를 생성하고 이를 공유하기 때문에 이러한 문제를 해결하였다.
참고자료