[iOS] Singleton
싱글톤이란?
- 싱글톤은 전역 변수를 사용하지 않고 객체를 하나만 생성 하도록 함
- 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴
- 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나
- 최초 생성 이후에 호출된 생성자는 최초에 생성자가 생성한 객체를 리턴
싱글톤의 특징
- 고정된 메모리 영역을 얻으면서 동시에 단 한번만 인스턴스가 생성되기 떄문에 메모리 낭비를 방지
- 싱글톤으로 만들어진 인스턴스는 전역으로 사용되기때문에 다른 클래스의 인스턴스들이 데이터를 공유하고 변경 가능
- 너 많은 일을 위임할 경우 결합도가 높아지는 문제 존재
싱글톤패턴의 주의점
- 상태를 가진 객체를 Singleton으로 만들면 안됨
- 상태가 공유된다는 것은 이를 전역에서 접근할 수 있다는 것
- 각기 다른 스레드에서 객체의 상태를 마구잡이로 변경할 시 문제 발생 가능성 존재
- 무상태 객체 or 설계상 유일해야하는 시스템 컴포넌트를 Singleton으로 만들어야함
싱글톤은 안티패턴?
- SOLID 원칙의 대부분은 인터페이스 설계와 관련이 되어있음
- Singleton을 사용하는 경우 대부분 구현 클래스의 객체를 미리 생성해 놓고 정적메소드를 이용하여 이를 구현하게 되므로 SOLID 원칙을 위반 할 가능성 존재 + Singleton을 사용하는 곳과 Singleton class 사이에 의존성이 생김 -> 결합도를 높이므로 수정 및 단위테스트의 어려움이 증가
객체지향의 의도와 맞지 않는다.
- Singleton의 사용은 Global state를 만들 수 있기 때문에 바람직하지 x
- 아무 객체나 자유롭게 접근, 수정, 공유할 수 있는 전역 상태를 갖는 것이 객체지향 프로그래밍에서 지양되어야 할 모델
리팩토링에서의 영향도가 프로그램 ‘전체’가 된다.
- Singleton으로 이루어진 객체가 변경이 일어나면 이를 사용하는 모든 서비스들에게 변경 전파가 이루어짐 -> 영향도가 어플리케이션 전체
싱글톤 패턴의 대안 - 의존성 주입(dependency injection)
- 의존성 주입의 가장 중요한 장점은 투명성 > 싱글톤의 장점인 편의성
- 코드 기반의 명확성을 더해주기 때문에 어떤 객체가 어떤 객체에 의존하고 있는지를 정확하게 나타냄
- 타입의 요구사항을 정의하기 위한 매우 유용한 도구
결론
- 싱글톤 객체는 아무데서나 마음대로 접근하라고 만든 객체가 아니고 편리함이 목적이 아니라 어떤 시점에도 클래스의 인스턴스가 단 하나만 존재하도록 보장하는 것 -> 매우 제한적으로 사용해야 유리
댓글남기기