C++ 문법

디자인 패턴, 정적 변수(static)

슬뷔 2022. 4. 15. 03:28
디자인 패턴

디자인패턴 : 클래스를 이용해서 구조를 설계할 때 자주 사용하는 방식을 일종의 패턴화 하여 만들어놓은 클래스 설계 패턴이다.

 

종류 : Builder 패턴, Abstract Factory 패턴, Factory method 패턴, prototype 패턴, Singleton 패턴 등등

싱글톤패턴 : 파일 실행시 특정 클래스가 한번만 메로리를 할당하고 메모리에 인스턴스를 만들고 사용하는 디자인 패턴이다.

 

아래는 싱글톤 패턴을 메크로화 시킨 것이다.

생성자와 소멸자를 private으로 지정한다면 객체를 생성할때 생성자가 자동으로 호출이 되는데 

private이기 때문에 이 클래스의 외부에서는 객체 생성이 허용이 안된다.
소멸자도 마찬가지로 private이기 때문에 이 객체 외부에서 제거하려한다면 호출이 안되서 문제가 된다.

 

m_Inst 가 nullptr 이라면, 생성된 객체가 없으므로 동적할당을 통해 객체를 생성하고 그 주소를 포인터에 저장해둔다.

만약 주소가 저장되어 있다면, 이미 객체가 생성되고 주소를 가지고 있으므로 다시 생성을 안 해준다.

 

DECLARE_SINGLE은 1번만 생성하고 싶은 헤더파일의 클래스안에 넣어주면 된다.

 

static (정적 변수)

static 멤버 변수는 이 클래스를 이용해서 객체를 아무리 많이 만들더라도 단 1개의 메모리 공간만 만들어지게 되고,

모든 객체가 이 공간을 공유해서 사용하는 변수가 만들어지게 된다.

static멤버변수는 사용할때 클래스 외부에 변수의 정의를 해주어야 한다.

 

함수의 주소는 이 클래스를 이용해서 객체를 아무리 많이 만들게 되더라도 무조건 1개의 주소만 나온다.
왜냐하면, 함수의 주소는 코드영역에 올라간 함수의 주소가 나오므로 당연히 1개만 존재할 수 있는 것이다.
그런데 실제 함수를 호출하면 각 객체별 멤버변수를 정확하게 인식을 하고 있다.

이렇게 각 멤버별 인식을 하게 되는 이유는 this포인터 때문이다.
this 포인터는 자기 자신의 주소이다.

클래스는 내부적으로 this를 하나 가지고 있게 된다.
그래서 함수를 호출할 때 객체.함수명() 으로 호출을 하게 되는데,
호출시 this에 저장되는 메모리 주소를 호출하는 객체의 주소로 주게 된다.
멤버변수를 사용시 this-> 가 생략되어 있으므로 
test.Output() 을 하면 this가 test의 주소가 되어 this->m_Number가 되므로 

이때는 test의 m_Number가 되고,
test1.Output1() 을 하면 this가 test1의 주소가 되어 this->m_Number가 되므로 

이때는 test1의 m_Number가 된다.

 

정적 멤버함수는 일반 멤버변수를 사용할 수 없다.
왜냐하면 정적 멤버함수에서는 this가 없기 때문이다.
정적 멤버함수에서는 static 멤버변수만 사용이 가능하다.
정적 멤버함수는 일반 전역함수처럼 인식이 가능하다.

 

'C++ 문법' 카테고리의 다른 글

string 의 substr 함수  (0) 2024.01.04
C++ BigInteger 구현  (1) 2024.01.04
생성자와 소멸자, 헤더 파일, cpp 파일  (0) 2022.04.15
클래스  (0) 2022.04.15
파일 관련 함수 2 (fwrite, fseek, ftell, fread)  (0) 2022.04.15