핵심이 되는 특수객체(중요한 객체)의 생성을 1개로 제한하는 방식
이 때, 객체 생성은 1개로 제한하고, 이미 객체가 있는 경우 생성이 아닌 해당 객체의 주소를 Return 해줌으로써 객체의 중복 생성을 방지한다.
문제점
객체를 생성해서 되돌려주는 멤버 함수로 만들경우, 해당 함수는 객체를 통해서 호출을 해야하는데, 객체의 생성을 방지함.
멤버 함수에는 this가 생략되어 있다. 즉, this가 있으려면 객체가 있어야 하는데 호출할 객체가 존재 하지 않다.
-> 그럼 어떻게 해야할까?
객체가 없어도 되는 멤버 함수를 만들면 된다!
static 을 사용하여 객체의 유/무에 상관없이 호출이 가능하게 만들면 된다.
어떻게 멤버 함수가 객체 없이 호출이 될까?
객체 없이 호출이 가능하다면 멤버에 접근할 수 없다.
this 키워드가 없다는 뜻 !
하지만 ! 유일하게 접근이 가능한 멤버가 있다.
static 을 사용한 정적 멤버에는 접근이 가능하다.
"정적 멤버에 접근이 가능한 이유"
정적 멤버는 데이터 영역을 사용한다.
따라서, 해당 class의 객체의 생성 / 해제 와 상관없이 데이터 영역에 존재한다.
즉, 해당 class 의 객체의 갯수(혹은 영역)와 상관없이 단 1 개만 존재한다.(유일)
그리고 정적 멤버는 해당 class 내부에서만 접근이 가능하며, this 가 존재하지 않다.
결론:
정적 멤버는 객체 안에 들어있는 것이 아닌, 데이터 영역 어딘가에
딱 1개만 존재하기 때문에, 구별이 가능하다.
해당 class를 통틀어 데이터 영역에 단 하나만 존재하기 때문에,
this 키워드 없이 정적 멤버 함수에서 접근할 수 있는 유일한 멤버이다.
정적 멤버는 점적 멤버 함수에 밖에 접근하지 못하는 것이 아닌,
정적 멤버 함수는 정적 멤버밖에 접근하지 못하는 것이 맞다.
지역 변수로 정적 변수를 선언할 경우 초기화 구문은 최초 1 회만 실행된다.
e.g.
static CCore* GetInst()
{
// new 는 최초 1회만 실행된다.
static CCore* pCore = new CCore;
}
싱글톤으로 생성한 객체는 동적할당 했기 때문에 해제도 직접 해주어야 한다.
해제를 위한 함수 또한 정적 함수로 만들어야 한다.
이런 문제점을 해결 하기 위해 객체의 주소를 받는 변수를 생성 / 해제 함수에서 모두 사용이 가능하도록 정적 멤버 함수로 만들어야 한다.
지금까지 알아본 싱글톤 설계 방식을 토대로 싱글톤을 설계해보자.
정적 멤버는 반드시 클래스 선언 밖(class 외부)에서 초기화를 해주어야 한다.
데이터 영역에 올라갈 것이기 때문에 반드시 초기 값을 지정해주어야 한다.