Static 이용하기
Static 변수
- static 변수는 한번 생성되면 객체가 종료될 때가 아닌, 프로그램이 종료될 때 소멸되므로 이를 생성된 객체의 개수를 세는데 활용할 수 있다.
- 클래스 내부에서 static 변수를 선언하는 경우에는 초기화를 할 수 없기 때문에 외부에서 초기화를 진행한다. (기존에는 static은 따로 초기화를 하지 않아도 0으로 설정되었지만, 클래스는 그것이 이뤄지지 않음)
static 변수를 이용하여 객체 개수 세기
#include <iostream>
using namespace std;
class Ex {
private:
static int objectNum; // static 변수
public:
Ex();
~Ex();
};
int Ex::objectNum = 0; // static 변수 초기화
Ex::Ex() {
objectNum++; // 객체 생성하고 개수 추가
cout << "객체 생성 및 초기화 완료." << endl;
cout << "현재 생성된 객체의 수는 " << objectNum << "입니다. " << endl;
}
Ex::~Ex() {
objectNum--; // 객체가 소멸되면 개수 감소
cout << "객체가 소멸되었습니다." << endl;
cout << "현재 남아있는 객체의 수는 " << objectNum << "입니다. " << endl;
};
int main() {
Ex* ex[3];
ex[0] = new Ex;
ex[1] = new Ex;
ex[2] = new Ex;
cout << endl;
// 동적 메모리 해제
delete ex[0];
delete ex[1];
delete ex[2];
return 0;
}
객체 생성 및 초기화 완료.
현재 생성된 객체의 수는 1입니다.
객체 생성 및 초기화 완료.
현재 생성된 객체의 수는 2입니다.
객체 생성 및 초기화 완료.
현재 생성된 객체의 수는 3입니다.
객체가 소멸되었습니다.
현재 남아있는 객체의 수는 2입니다.
객체가 소멸되었습니다.
현재 남아있는 객체의 수는 1입니다.
객체가 소멸되었습니다.
현재 남아있는 객체의 수는 0입니다.
Static 함수
- 클래스에 static 함수를 정의할 수 있다.
- static 함수는 객체에 종속되는 것이 아니기 때문에, 클래스 자체에서 호출할 수 있다.
- 객체에 종속되는 것이 아니기 때문에 다른 변수에 접근할 수 없고, static 변수만 이용할 수 있다는 점에 유의하자.
Static 함수 구현하기
#include <iostream>
using namespace std;
class Ex {
private:
static int objectNum;
public:
static void printNum();
Ex();
~Ex();
};
int Ex::objectNum = 0;
Ex::Ex() {
objectNum++;
}
Ex::~Ex() {
objectNum--;
};
void Ex::printNum() {
cout << "현재 객체의 수는 " << objectNum << "입니다. " << endl;
}
int main() {
Ex* ex[3];
ex[0] = new Ex;
// 개수 확인 1
Ex::printNum(); // 클래스 자체에서 호출한다.
ex[1] = new Ex;
ex[2] = new Ex;
// 개수 확인 2
Ex::printNum();
// 동적 메모리 해제
delete ex[0];
delete ex[1];
delete ex[2];
// 개수 확인 3
Ex::printNum();
return 0;
}
현재 객체의 수는 1입니다.
현재 객체의 수는 3입니다.
현재 객체의 수는 0입니다.
Const
- Class를 구현할 때 대부분의 경우 변수를 초기화할 수 없지만, const 키워드를 이용하여 상수 처리한다면 정의와 동시에 초기화할 수 있다.
- 그리고 '상수 함수'로 읽기만 수행하는 함수를 선언하여 사용할 수 있다. 상수 멤버 함수로 정의하여 해당 함수는 멤버 변수를 변경하지 않는 함수임을 명시할 수 있다. 상수 함수 내에서 호출할 수 있는 함수는 다른 상수 함수밖에 없다.
- 상수 멤버 함수는 다음과 같이 정의한다.
(기존 함수의 정의) const;
// example
void printNum() const;
상수 멤버 변수 & 상수 멤버 함수
#include <iostream>
using namespace std;
class Ex {
private:
const int x = 10;
public:
void printNum() const;
Ex();
~Ex();
};
Ex::Ex() {
}
Ex::~Ex() {
};
void Ex::printNum() const {
cout << "x = " << x << "입니다. " << endl;
}
int main() {
Ex ex;
ex.printNum();
return 0;
}
x = 10입니다.
- 상수 키워드 const를 이용하면 class 정의에서도 멤버 변수를 초기화할 수 있다.