관리자 글쓰기
C++ 생성자와 정적 멤버3
2022. 5. 16. 11:38 - pingu-s

정적 멤버

 

(1) 멤버와 객체

 

집(House) 클래스의 객체에 관해 살펴보기로 한다. 객체를 생성함으로써 각각의 객체에 address, space와 telephone에 값을 대입하거나 출력할 수도 있었다. 집의 주소와 평수, 전화번호란 값이 각각의 집에 존재하고 있는 것처럼 각 객체마다 데이터 멤버에 값을 저장하는 것이 가능하다. 이것을 데이터 멤버 address, space, telephone은 객체에 관련되어 있다고도 한다. 

또한 show() 멤버 함수도 객체를 생성함으로써 호출할 수 있다. 이 멤버 함수도 객체에 관련되어 있다. 이와 같이 객체가 생성되어 있을 때 접근할 수 있는 통상의 멤버는 객체에 관련되어 있다.

 

사실 클래스에서는 객체에 관련되어 있지 않는 멤버를 가질 수 있다. 이것을 클래스 전체에 관련되어 있다고 하는 것이다. 클래스에 관련되어 있는 멤버를 정적 멤버(static member)라고 한다.

정적 멤버로 되는 데이터 멤버 및 멤버 함수는 선언할 때에 static이라는 기억 클래스 지정자를 붙인다. 실제로 코드를 입력하면서 학습해 보기로 한다. 다음의 코드를 살펴보기로 한다.

 

 

예제 13-6) 정적 멤버와 정적 멤버 함수

정적 멤버와 정적 멤버 함수를 사용하여 집이 생성되는 수를 계산하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

//House 클래스의 선언
class House{
private:
	const char* address;
	int space;
	const char* telephone;
public:
	static int sum; //정적 데이터 멤버를 선언한다.
	House();
	void show();
	void setHouse(const char* a, int s, const char* t);
	static void showSum(); //정적 멤버 함수를 선언한다.
};

House::House()
{
	address = "";
	space = 0;
	telephone = "";
	sum++; //생성자가 호출되었을 때에 정적 데이터 멤버 sum의 값을 1증가시킨다.
	cout << "하나의 집을 생성했습니다.\n";
}

void House::show()
{
	cout << "집의 주소는 " << address << "입니다.\n";
	cout << "집의 평수는 " << space << "평입니다.\n";
	cout << "집의 전화번호는 " << telephone << "입니다.\n";
}

void House::setHouse(const char* a, int s, const char* t)
{
	address = a;
	space = s;
	telephone = t;
	cout << "주소는 " << address << ", 평수는 " << space << "이고, 전화번호는 "
		<< telephone << "인 집을 생성했습니다.\n";
}

void House:: showSum() //정적 멤버 함수를 정의한다.
{
	cout << "집은 모두 " << sum << "채 입니다\n";
}

int House::sum = 0; //정적 데이터 멤버를 초기화한다.

int main()
{
	House::showSum(); //정적 멤버 함수를 호출한다.

	House house1; //객체를 생성한다.
	house1.setHouse("인천시 남구", 24, "321-2322");
	House::showSum();

	House house2;
	house2.setHouse("서울시 북구", 51, "555-6565");
	House::showSum();

	return 0;
}

 

여기서는 데이터 멤버 sum에 static을 붙여 정적 멤버로 하고 있다.

static int sum; //static을 붙인 정적 데이터 멤버이다.

 

이 sum은 클래스에 관련되어 있으므로 각각의 객체의 생성자 내에서는 초기화하지 않는다. House::를 붙여 함수의 밖에서 초기화한다. 그래서 집 객체가 1개 생성될 때마다 생성자 내에 [sum++;]이라는 문장이 처리되어 1개씩 값이 증가되도록 하고 있다. 즉, sum은 클래스 전체에 몇 채의 집(몇 개의 객체)이 존재하고 있는가를 나타내는 데이터 멤버로 되어 있는 것이다.

이와 같이 클래스 전체에 취급하는 데이터를 저장해 두는 데이터 멤버, 즉, 모든 객체가 공유하는 멤버가 정적 데이터 멤버인 것이다.

 

다음에 static을 붙인 멤버 함수인 showSum() 함수의 선언을 살펴보도록 한다. 

static void showSum(); //static을 붙인 정적 멤버 함수이다.

 

정적 멤버로 되어 있는 멤버 함수는 그 클래스로부터 객체가 생성되지 않아도 호출할 수 있다는 구조를 가지는 멤버 함수이다. 통상의 멤버와 같이 객체에 관련된 멤버는 아니다.

정적 멤버 함수는 정적 데이터 멤버를 출력하거나 클래스 전체에 관계되는 처리를 수행한다. 정적 멤버 함수는 객체가 생성되어 있지 않아도 호출되는 것처럼 다음과 같이 호출한다.

 

[구문 : 정적 멤버 함수의 호출]

클래스명::함수명(인수 리스트);

 

상기의 코드에서는 다음과 같이 정적 멤버 함수를 호출하고 있다.

House::showSum(); //클래스명을 붙여 호출한다.

 

이 정적 멤버 함수에서는 정적 데이터 멤버 sum의 값을 출력한다. sum의 값은 처음에는 0이지만 객체를 1개 생성한 후에 한 번 더 호출하면 1로 되어 있는 것을 알 수 있다. 정적 멤버를 사용해서 클래스 전체에 집이 몇 채인가를 관리할 수 있다.

 

(2) 정적 멤버에 관한 주의

 

정적 멤버 함수 내에는 통상의 멤버에 접근할 수 없다.(정적 데이터 멤버에만 접근 가능) 정적 멤버 함수는 특정한 객체에 관련된 것이 아니기 때문이다.

정적 멤버 함수는 객체가 생성되어 있지 않아도 호출되는 경우가 있다. 그래서 특정한 객체에 관련되어 있는 통상의 멤버에 접근할 수 없는 것이다.

즉, 다음의 코드는 오류가 된다.

 

 

 

출처: 박흥복서정희. 2015. C++ 프로그래밍 (초보자를 위한). 문운당

'개발 > C++' 카테고리의 다른 글

문법 정리  (0) 2024.07.25
배열, 리스트, 벡터  (1) 2024.04.30
C++ 생성자와 정적 멤버2  (0) 2022.05.12
C++ 생성자와 정적 멤버  (0) 2022.05.12
C++ 클래스와 객체3  (0) 2022.05.12