본문 바로가기

기타/Programming Base Knowledge

Static


static - 정적선언

class GameLoop
{
public:
    static GameLoop * getInstance() { static GameLoop instance; return &instance; }
    void run();

private:
    GameLoop() { }
};

 - 정적 선언으로 컴파일시 스택에 메모리가 잡히게 된다.
 - 보통 멤버 변수는 그 함수나 클래스가 실행시 메모리에 잡히게 되는데
 - static로 선언하면 컴파일시 스택에 메모리가 잡혀서
 - 클래스가 종료 되어도 메모리에 남아 있게 되어 그 클래스를 후에 다시 호출해도
 - static로 선언된 변수는 다시 생성되는 것이 아니고 처음에 생성된 값으로 연산
 - 전역변수로 선언해도 같은 결과인데 전역 변수 선언은 객체지향의
 - 캡슐화를 어기는 결과이다.
 - 위와 같은 소스는 GameLoop()의 생성자가 private로 선언 되어 있으므로
 - 그 클래스 안에서만 사용될 수 있으므로 main에서 GameLoop a; 로 선언하면
 - 객체 a생성시 생성자가 호출하게 되는데 private로 선언되어 있으므로 에러가 난다.
 - 그러므로 GameLoop안에서 그 자신을 가리키는 static로 멤버 함수를 선언해서
 - main에서는 getInstance를 호출해서 사용할 수 있고 이는 단 하나의 객체만을
 - 생성할 수 있는 결과이다. 이것은 singleton패턴의 기초형이다.

 - static로 선언된 변수는 상속 받은 클래스에서 사용할 수없으므로
 - static으로 선언하고 나서 그 선언된 클래스 밖에서 따로 초기화를 해줘야만
 - 상속받은 클래스에서 사용할 수 있다.

EX)

class init
{
public:
 static float y[5];
};

float init::y[5] = {0.0,1.5,3.0,4.5,6.0};

'기타 > Programming Base Knowledge' 카테고리의 다른 글

C++ 기본 지식  (0) 2009.05.02
라이브러리 추가  (0) 2009.05.02
cin.get()  (0) 2009.05.02
ifndef. define  (0) 2009.05.02
유니코드 사용  (0) 2009.05.02