싱글톤 패턴을 사용한 클래스와 정적 클래스 전부 프로그램 상에서 단 하나만 존재하는 클래스 이다.
싱글톤 패턴을 처음 배울 당시에는 "그냥 Static을 사용하면 되는거 아니야?" 라는 생각을 했었는데 찾아 보지 못하고 이제서야 정리를 해보게 되었다.
싱글톤 패턴?
클래스의 인스턴스가 프로그램 전체에 걸쳐 단 하나만 존재하도록 보장하는 구조
예를들어 현재 유저의 경험치와 같은 중요한 부분이 여러 객체에서 동시에 관리가 된다면, 어떤 객체에 있는 경험치가 유저의 진짜 경험치인지 알 수가 없기 때문에 여러부분에서 문제가 발생한다.
이런 부분은 싱글톤 패턴으로 구현하여 경험치를 관리하는 클래스는 단 하나의 객체만 존재하도록 해야한다.
정적 클래스로는 불가능 한가?
곰곰히 생각해보면 정적 클래스도 같은 역할을 할 수 있다.
단 하나만 존재하며, 어디서든 접근이 가능하다.
심지어 호출을 할 때도 클래스명.변수 or 클래스명.함수로 싱글톤 패턴의 클래스보다 간단하게 접근이 가능하다.
그럼 무엇이 다를까?
초기화(생성) 시점
정적 클래스는 프로그램 실행 시점에 자동으로 초기화 된다.
그렇기 때문에 프로그램의 실행 동안에 메모리에 상주한다.
싱글톤 패턴을 사용한 클래스는 생성 시점을 정할 수 있다.
필요한 시점에 생성을 해서, 리소스를 효율적으로 사용 가능하다.
대신 인스턴스 생성에는 비용이 든다. 반대로 필요없는 시점에 해제(삭제)도 가능 하다.
확장성
정적 클래스는 상속,인터페이스 구현이 불가능하다.
그리고 모든 변수와 함수에 static 키워드를 붙여야 하는 번거로움도 있다.
싱글톤 패턴을 사용한 클래스는 상속, 인터페이스 구현이 가능하다.
그렇기 때문에 조금 더 확장성을 가진다.
호출
정적 클래스는 클래스명.함수 로 쉽게 호출이 가능하다.
싱글톤 패턴을 사용한 클래스는 Instance 변수를 통하여 호출한다.
생성자
정적 클래스는 정적 생성자만을 가질 수 있다.
매개변수를 갖지 못하며, public/private와 같은 액세스 한정자를 쓰지 못한다.
싱글톤 패턴을 사용한 클래스는 일반 클래스 처럼 생성자를 사용 가능하다.
[유니티 한정] 인스펙터 사용의 이점
정적 클래스는 상속을 받을 수 없기 때문에 MonoBehaviour를 상속 받을 수 없고,
이는 유니티의 오브젝트에 해당 클래스를 붙일 수 없다는 뜻이 된다.
즉, 유니티의 인스펙터에서 클래스 안의 변수와 같은 부분을 사용하지 못한다.
싱글톤 패턴을 사용한 클래스는 상속을 받을 수 있기 때문에,
MonoBehaviour를 상속 받고 유니티 오브젝트에 붙일 수 있다.
인스펙터에서 변수와 같은 부분을 사용 가능하다.
각각 어디에 쓰면 좋을까?
정적 클래스
프로그램의 시작과 끝을 함께하고 확장성이 부족하기 때문에 어디에서나 필요하고 간단한 역할을 하는 클래스가 어울린다고 생각했다.
1. 게임에 필요한 상수를 정의 해놓는 클래스
2. 게임의 전체적인 Enum을 정리해놓은 클래스
3. 개발의 편의성을 올려주는 함수를 모아둔 클래스 (Ex. 게임 유틸 클래스)
싱글톤 패턴 사용 클래스
원하는 시점에 생성을 하며 확장성이 있기 때문에 게임에서 중요한 역할을 하며 확장성이 필요한 ' - 매니저 ' 가 붙은 클래스들에게 어울린다고 생각했다.
또, 인스펙터에서 변수를 활용 할 수 있다는 점에 있어서 편리함과 협업에서의 이점이 크다고 생각한다.
1. 유저 매니저
2. 팝업 매니저
마무리
제일 처음 예시를 들었던 유저 경험치를 관리하는 클래스는 싱글톤 패턴을 사용하거나 정적 클래스를 사용하거나 전부 가능하다.
중요한것은 그 클래스가 추가로 어떤 기능을 할것이며, 사용을 했을때 어떤 이점이 있는지를 잘 생각하며 개발을 해야하는 것 같다.
'프로그래밍 공부 > 디자인 패턴' 카테고리의 다른 글
디자인 패턴 - <데코레이터 패턴> (Decorator Pattern) (0) | 2022.11.21 |
---|---|
디자인 패턴 - <옵저버 패턴> (Observer Pattern) (0) | 2022.11.20 |
디자인 패턴 - <전략 패턴> (Strategy Pattern) (2) | 2022.11.14 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!