개요

본문에 들어가기전 Swift를 스프링처럼 사용하는게 뭐지? 어떤 의미지? 라는 의문이 드시는 분들은 앞에 작성한 글

Swift를 스프링처럼 사용하기 - 0편 Swift를 어떻게 Spring처럼 사용해? 편을 읽고 와주시면 감사하겠습니다!

 

주의!

본문에 들어가기전 본 글에서 필요한 지식만 얻어가시고 본인이 틀렸다고 생각드는 부분은 필터링해서 읽으시길 바랍니다

Swift에서 싱글톤 인스턴스를 어떻게 생성할까?

싱글톤이란 간단히 설명드리면 인스턴스를 필요할때마다 new 하여 생성하지 않고 하나의 단독 인스턴스만 생성하여

인스턴스가 필요할때 기존의 만들어진 인스턴스를 활용하는 방식인데요, 이것을 싱글톤 인스턴스라고 부릅니다.

 

싱글톤 인스턴스를 만드려면 몇가지 조건이 필요합니다.

  1. 싱글톤 인스턴스 외에 다른 인스턴스가 생성이 되면 안됨.
  2. 싱글톤 인스턴스는 코드 전역에서 사용이 가능해야합니다.

하나씩 방법을 알아보겠습니다. 본 글에선 구현체로만 예시를 들어 설명드리겠습니다. 

추상클래스와 구현체를 나누어서 사용하는법은 4편 Swift에서 의존성 주입을 해보자! 에서 연계하여 설명드리겠습니다 

싱글톤 인스턴스 외에 다른 인스턴스가 생성이 되면 안됨

싱글톤 패턴의 의미를 다시 리마인드 해보자면 단 하나 (Single)의 인스턴스를 생성하여 사용해야합니다.

그러니 당연히 싱글톤 인스턴스외에는 다른 인스턴스가 생성이 되면 안되겠지요?

public class exampleClass {
    let shared = exampleClass()
    private init() {}
 }

Swift에서 싱글톤 인스턴스를 생성하는 예제 코드입니다. 간단하게 설명을 드리겠습니다

먼저 shared라는 변수를 생성합니다.

shared라는 이름답게 클래스 내부에서 자기 자신을 생성하면서 다음과 같이 접근 할 수 있도록 변수를 생성하게 됩니다.

public func someFunc() {
	let a = exampleClass.shared.호출하고싶은요소
 }

이렇게 외부에서도 shared라는 하나의 일관적인 싱글톤 인스턴스에 접근 할 수 있도록 도와줍니다.

 

밑에 private init은 아주 간단합니다.

외부에서 객체의 인스턴스를 생성하지 않도록 접근제어자로 막아주는 역할을 합니다.

 

이렇게 되면 shared라는 공통적인 인스턴스를 생성하고 외부에서는 더 이상 새로운 인스턴스를 생성하지 못하게 됩니다.

그렇다면 이렇게 생성한 인스턴스를 어떻게 불러와서 사용해야는지 알아야겠죠?

싱글톤 인스턴스를 코드 전역에서 사용이 가능해야합니다

 이렇게 만들어진 싱글톤 인스턴스를 어떻게 코드 전역에서 필요할 일이 있을때 불러서 사용할까요?

이 부분에 대해선 프로젝트마다, 개발자마다 다르다고 생각을 했습니다.

프로젝트 규모가 크고 유지보수에 대한 중요도가 높을때는 여러가지 전략패턴을 사용해서 구조적으로 설계를 해서 사용해야한다고 생각을 하고 제 경우는 2~3가지 단순 기능을 일관되게 수행하는 앱이였어서 간단하게 구현을 했습니다.

 

스프링에서의 기억을 살려서 appConfig라는 앱을 만든 뒤 어떤 클래스도 선언하지 않고 사용했습니다.

let exampleInstance = exampleClass.shared

 이런식으로요, 약간의 주석과 함께 한다면 더 좋겠죠? 만약 추상 클래스와 구현체를 나눈다면 아래와 같습니다.

let exampleInstance:exmapleClass = exampleClassImpl.shared

물론 저의 상황을 간단히 설명드리자면 위 Config에 선언한 인스턴스들이 앱의 동작에 무조건 필요하였고, 

사용자가 이런 저런 기능을 선택하지 않고 하나의 기능을 수행하는 어플리케이션이였기 때문에 이렇게 했어도 문제가 없었다고 생각합니다. 하지만 더 큰 규모에선 사용자가 사용하지 않은 불필요한 인스턴스가 생성되서 리소스를 차지할 수도 있고 여러 사이드 이펙트들을 고려하여 조금 더 구조적인 설계를 해야한다고 생각합니다.

여러분들이 슬기롭게 자신에 프로젝트에 맞춰서 잘 적용해서 사용하시면 좋을것 같습니다!

 

다음편은 3편 SwiftUI에서 AOP를 사용해보자! 로 만나뵙겠습니다.

감사합니다.

 

잘못된 내용이나 수정해야 할 부분이 있으면 가감없이 댓글로 피드백해주시면 감사하겠습니다! 

반응형
복사했습니다!