xtring.dev

[iOS] 싱글톤(Singleton) 패턴을 알아보자! 본문

Mobile/iOS

[iOS] 싱글톤(Singleton) 패턴을 알아보자!

xtring 2021. 3. 4. 00:59

 

 

 

 

 

Apple

 

 

 

 

 

 

  iOS 공부를 시작하며 싱글톤(singleton) 패턴이라는 단어를 자주 지나쳤던 것 같습니다. 꼭 알아야하는 개념이라고 생각되어 정리합니다. 😇

 

 

 

 

 

 

  싱글톤 패턴이란?

 

  생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나라는 의미입니다. 이게 어떻게 가능하냐면 최초에 객체를 고정된 메모리 영역에 할당(Static)하고 그 메모리에 인스턴스를 만들어 사용해 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 방금 할당했던 메모리 영역에서 호출됩니다. 그리고 이를 코드로서 구현한 것이 싱글톤 패턴(singleton pattern)이라고 합니다.

 

 

 

  이렇게 고정된 메모리 영역을 통해 한번의 인스턴스를 사용하는 것은 어떤 이점이 있을까요? 직관적으로는 똑같은 객체를 메모리의 여러 위치에 할당하지 않아도 되기 때문에 메모리 낭비를 최소화 할 수 있습니다. 구체적으로 말하자면 특정 클래스의 인스턴에 접근할 때 항상 동일한 인스턴스만을 반환하도록 설계하는 패턴입니다. 따라서 싱글톤 패턴은 많은 곳에서 활용될 수 있습니다.

 

 

  만약 싱글톤 패턴을 사용하지 않는다면? 회원정보를 입력하는 A/B/C ViewController가 존재하며 각각 ID, Password, Name를 받는다고 가정해봅시다. 싱글톤 패턴을 사용하지 않으면 UserInfo라는 클래스를 만들어 두고 각 ViewController가 실행 될 때마다 UserInfo 클래스를 통해 객체를 생성하고 각 ViewController에 따른 데이터를 저장할 수 있습니다. 그렇게되면 당연히 같은 구조의 객체가 3개가 생깁니다.

 

 

 

[A Controller]

UserInfo: {

  id: "xtring",

  password: nil,

  name: nil

}

 

 

[B Controller]

UserInfo: {

  id: nil,

  password: 12341234,

  name: nil

}

 

 

[C Controller]

UserInfo: {

  id: nil,

  password: nil,

  name: "hyun"

}

 

 

 

  이런 경우가 위에서 말했던 메모리를 낭비하는 경우죠. 하나의 Instance에 모든 정보가 저장되어야 하지만 그렇지 못하고 있습니다. 🥲

 

  하지만 싱글톤 패턴은 하나의 메모리에 Instance를 할당하고 생성자에 의해 호출될 경우 다시 그 메모리 위치로 접근한다고 설명했습니다.

 

 

 

[A Controller]

UserInfo: {

  id: "xtring",

  password: nil,

  name: nil

}

 

 

[B Controller]

UserInfo: {

  id: "xtring",

  password: 12341234,

  name: nil

}

 

 

[C Controller]

UserInfo: {

  id: "xtring",

  password: 12341234,

  name: "hyun"

}

 

  

 

  하나의 Instance를 통해 데이터를 다루는 방법은 꼭 싱글톤이 아니더라도 가능하지만 직접 구현하게 되면 코드가 지저분해지는 경우가 생깁니다. App 내에서 다양한 위치에서 UserInfo 인스턴스가 참조되어야 할 때마다 매번 해당 인스턴스를 넘겨주어야 합니다.

 

 

 

  하지만 싱글톤 패턴도 단점이 존재합니다. Instance가 너무 많은 일을 하거나, 많은 데이터를 공유시킬 경우 다른 클래스의 Instance들 간 결합도가 높아져 "개방=패쇄" 원칙을 위배합니다. 이는 객체 지향 설계 원칙에 어긋납니다. 따라서 수정과 테스트, 유지보수가 어려워질 수 있습니다.

 

 

 

 

 

 

 

반응형
Comments