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