Static, 싱글톤

2022. 7. 1. 11:07C#/C#에 대한 다양한 공부

[static]

static 키워드는 변수나 함수, 클래스에 정적 속성을 부여하는 것으로 클래스로부터 객체를 생성하지 않고 변수나 함수를 호출할 있도록 해주는 것이다. 클래스의 일반 멤버 변수는 클래스의 객체가 생성될 , 객체마다 따로 생기지만, 정적 변수는 해당 클래스가 처음으로 사용되는 때에 한번만 초기화되어 계속 동일한 메모리를 사용하게 된다.

도식으로 보면 위의 그림과 같다. 정적 변수를 포함한 클래스 A 객체를 개를 생성하여 이름을 object1, object2라고 했을 , 인스턴스에는 정적 변수가 포함되지 않으며, 일반 멤버 변수만 포함된다. 클래스 A 정적 변수는 클래스 A 처음 사용되는 시점에 별도의 메모리 공간에 할당된다.

 

-> 생성된 객쳉 정적 변수가 포함되지 않는 것은 실제로 객체를 생성해서 멤버 변수를 찾았을 목록에 나오지 않는 것을 보면 확인할 있다.

 

  • 정적 클래스 : 필드와 메서드가 static으로 이루어진 class
  • 정적 메서드 : [클래스명.메서드명]으로 접근가능
  • 정적 필드 : [클래스명.필드명]으로 접근 가능

 

*static으로 만들어서 얻게 되는 이득은 무엇일까?

static으로 수식한 필드는 프로그램 전체에 걸쳐 하나밖에 존재하지 않는다. 프로그램 전체에 걸쳐 공유해야 하는 변수가 있다면, 정적 필드를 이용하면 된다. 게임으로 생각해본다면 게임 내에서는 새로운 씬이 로드되더라도 보존해야하는 변수를 static으로 선언하면 된다.

 

*단점은 없나?

여러곳에서 쉽게 접근할 있다는 점은 악용하게 경우, 아무곳에서나 접근해서 쓰려고 하다보면 코드가 덩어리마냥 의존성이 높아질 우려가 생긴다. 이럴 경우 관리가 힘들어 수도 있다.

 

*Singleton

객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다. 게임 시스템상 전역 변수의 역할을 하며 로드시 데이터가 파괴되지 않고 유지된다.

 

*싱글톤을 사용하는 이유

클래스의 인스턴스를 하나만 생성하고, 어디서든 인스턴스를 참조할 있도록 하는 패턴이다. 처음 사용될때 초기화를 시도하는 방법으로 싱글톤을 구현한다면, 게임 내에서 사용되지 않을 경우 아에 초기화되지 않을 것이므로 메모리를 사용하지 않게 된다.

 

*싱글톤 구현 방식

  • not thread-safe

-> 간단하게 구현할 수는 있지만, 두개의 스레드가 instance == null 이라고 판단하고 2개의 인스턴스를 생성할 위험성이 있음

 

  • simple thread-safety

스레드 안전성을 보장하기 위해 lock() 획득하는 구조로 만듬

-> 인스턴스가 생성하려 할때마다 매번 lock 획득하려는 시도를

 

  • Double-Checked Locking

인스턴스가 있는 경우 빠르게 리턴하기 위하여 lock밖에서 null체크를 하고 인스턴스가 생성되지 않은 경우 하나의 인스턴스를 생성하기 위하여 안에서 한번 체크하는 방식

 

  • MonoBehaviour 상속받는 싱글톤 구현

제네릭 싱글톤을 만들어 상속받은 클래스에서 코드를 중복으로 작성하지 않아도 싱글톤이 생성될 있도록 한다.

 

*싱글톤은 만능인가?

static 단점과 연결된다. 전역적으로 접근이 가능하다는 것은 사용하기에는 쉬울 있지만, 아무곳에서나 가져다 경우 코드가 덩어리 진것마냥 의존성이 강해질 있고 이는 나중에 관리하기가 힘들어질 우려가 생긴다. 또한 static 특성상 참조하려는 시점에 초기화 되는 특징을 살려 lazy 싱글톤을 만들 있으나, 이는 게임상에서 전투 도중에 초기화가 된다든지 하는 이유로 프레임 드랍이 발생할 있다.

-> 모든 적절히..

 

*정적클래스와 싱글톤 어느걸 사용해야하는가?

생각해보면 정적클래스와 싱글톤은 비슷한 기능을 하는 같다. 그럼 언제 정적 클래스를 사용하고 언제 싱글톤을 사용해야 할까? 초기부터 필요한 utility메소드들은 정적 클래스로 사용하면 좋을 것같고 다른것에는 싱글톤(생성 시점을 조절할 있기 때문) 사용하는게 좋을 것같다.

-> 상황에 맞게 사용…

'C# > C#에 대한 다양한 공부' 카테고리의 다른 글

dll, lib  (0) 2022.07.01
닷넷 프레임 워크 구조  (0) 2022.07.01
[async/await]  (0) 2022.07.01
Delegate  (0) 2022.07.01
델리게이트, 이벤트  (0) 2022.06.01