프로그래밍 언어/C & C++ 정리

정적 멤버와 상수 멤버

뽀또치즈맛 2024. 2. 5. 14:14

 

정적 멤버 변수

 

C++에서 정적 멤버란 클래스에 속하지만,

객체 별로 할당되지 않고 클래스의 모든 객체가 공유하는 멤버를 의미한다.

멤버 변수가 정적(static)으로 선언된다면,

해당 클래스의 모든 객체에 대해 하나의 데이터만 유지 관리된다.

 

정적 멤버 변수는 클래스 영역에서 선언되지만,

정의는 파일 영역에서 수행된다.

이러한 정적 멤버 변수는 외부 연결 (external linkage)을 가지므로,

여러 파일에서 접근할 수 있다.

 

정적 멤버 변수에도 클래스 멤버의 접근 제한 규칙이 적용되므로,

클래스의 멤버 함수나 프렌드만이 접근할 수 있다.

하지만 정적 멤버 변수를 외부에서도 접근할 수 있게 하고 싶으면,

정적 멤버 변수를 public 영역에 선언하면 된다.

 

다음 예제는 모든 Person 객체가 같이 공유하는

person_count_라는 정적 멤버 변수를 선언하는 예제이다.

 

#include <iostream>
using namespace std;

class Person
{
private:
	string name_;
	int age_;
public:
	static int person_count_;	// 정적 멤버 변수의 선언 
	Person(const string& name, int age);	// 생성자 
	~Person() { person_count_--; }			// 소멸자 
	void ShowPersonInfo();
};

int Person::person_count_ = 0;	// 정적 멤버 변수의 정의 및 초기화 

int main(void)
{
	Person hong("길동", 29);
	hong.ShowPersonInfo();
	Person lee("순신", 35);
	lee.ShowPersonInfo();
	
	return 0;
}

Person::Person(const string& name, int age)
{
	name_ = name;
	age_ = age;
	cout << ++person_count_ << " 번째 사람이 생성되었습니다." << endl;
}

void Person::ShowPersonInfo()
{
	cout << "이 사람의 이름은 " << name_ << "이고, 나이는 " << age_ << "살입니다." << endl;
}

 

이 정적 멤버는 Person 객체가 생성될 때마다 1씩 증가하여,

현재까지 총 몇 개의 Person 객체가 생성되었는지를 알려준다.

 

 

정적 멤버 함수 (static member function)

 

C++에서는 클래스의 멤버 함수도 정적(static)으로 선언할 수 있다.

이렇게 선언된 정적 멤버 함수는 해당 클래스의 객체를 생성하지 않고도,

크랠스 이름만으로 호출할 수 있다.

 

문법
1. 객체이름.멤버함수이름()   // 일반 멤버 함수의 호출
2. 클래스이름.멤버함수이름()  // 정적 멤버 함수의 호출

 

 

정적 멤버 함수는 정적 멤버 변수를 선언하는 방법과 같이 static 키워드를 선언한다.

 

이러한 정적 멤버 함수는 다음과 같은 특징을 갖는다.

 

  1. 객체를 생성하지 않고 클래스 이름만으로 호출할 수 있다.
  2. 객체를 생성하지 않으므로, this 포인터를 가지지 않는다.
  3. 특정 객체와 결합하지 않으므로, 정적 멤버 변수밖에 사용할 수 없다.

 

#include <iostream>
using namespace std;

class Person
{
private:
	string name_;
	int age_;
public:
	static int person_count_;	// 정적 멤버 변수의 선언 
	static int person_count();	// 정적 멤버 함수의 선언 
	Person(const string& name, int age);	// 생성자 
	~Person() { person_count_--; }			// 소멸자 
	void ShowPersonInfo();
};

int Person::person_count_ = 0;	// 정적 멤버 변수의 정의 및 초기화 

int main(void)
{
	Person hong("길동", 29);
	Person lee("순신", 35);
	cout << "현재까지 생성된 총 인원 수는 " << Person::person_count() << "명입니다." << endl;
	
	return 0;
}

Person::Person(const string& name, int age)
{
	name_ = name;
	age_ = age;
	cout << ++person_count_ << " 번째 사람이 생성되었습니다." << endl;
}

void Person::ShowPersonInfo()
{
	cout << "이 사람의 이름은 " << name_ << "이고, 나이는 " << age_ << "살입니다." << endl;
}

int Person::person_count()		// 정적 멤버 함수의 정의 
{
	return person_count_;
}

 

 

위의 예제에서는 정적 멤버 변수인 person_count_의 값을 출력하기 위해서

정적 멤버 함수 person_count()를 선언한다.

 

 

 

상수 멤버 변수 (constant member variable)

상수 멤버 변수란 한 번 초기화하면, 그 값을 변경할 수 없는 멤버 변수를 의미한다.

이러한 상수 멤버 변수는 변수의 타입 앞에 const 키워드를 사용하여 선언한다.

 

문법
const 타입 멤버변수이름;

 

클래스 전체에 걸쳐 사용되는 중요한 상수는 상수 멤버 변수로 정의하여 사용하는 것이 좋다.

예를 들어 총알의 max개수라던가 말이다.

 

 

상수 멤버 함수

 

 

상수 멤버 함수란 호출한 객체의 데이터를 변경할 수 없는 멤버 함수를 의미한다.

이러한 상수 멤버 함수는 함수의 원형 마지막에 const 키워드를 사용하여 선언한다.

 

문법
함수의원형 const;

 

호출한 객체의 데이터를 단순히 읽기만 하는 멤버 함수는

상수 멤버 함수로 정의하는 것이 정보 보호 측면에서도 좋다.