Programming/C,C++

static 멤버(정적멤버)

충남대이적 2022. 2. 21. 12:27

static 멤버변수, static 멤버함수

static 멤버변수와 static 멤버함수는 같은 클래스의 객체들이 공유할 수 있는 변수와 함수입니다. static 멤버변수는 일반 변수처럼 객체마다 생성되는 것이 아닌 "공유변수"로써 클래스 당 1개만 있는 것입니다.

 

예를 들어, 사람들이 의견을 공유하는 게시판이 있다고 생각해봅시다.

 

class Board

 

게시판에는 다양한 사람들이 글을 씁니다. 그리고 그 기록들이 차곡차곡 쌓이죠. 글 하나하나는 객체라고 볼 수 있고, 글이 쌓인 집합이 static변수로 볼 수 있습니다. 아래에서 관련예제를 보도록 하겠습니다.

 


static 변수,함수 사용법

static 멤버를 사용하기 위한 방법으로는 두 가지가 있습니다.

 

1. 객체의 멤버로 접근하는 방법

2. 클래스명과 범위지정연산자(::)로 접근하는 방법

 

static멤버의 특성을 이해하면 쉽습니다. static멤버는 공유멤버이므로 해당 클래스의 객체들은 당연히 접근할 수 있고, 클래스 당 1개밖에 없으니 클래스명으로 접근할 수도 있는 것입니다.

 

Board free_board; //객체생성
free_board.add("안녕하세요 잘 부탁드립니다");
Board::add("안녕하세요 잘 부탁드립니다")

 


1.static 멤버변수를 선언하면 외부에서 초기화가 이루어져야 한다.

static 멤버변수를 사용하면 외부에서 초기화가 이루어져야 합니다. 초기화하지 않으면 다음과 같은 오류가 발생합니다.

static 멤버변수를 초기화하지 않아 생기는 오류

string Board::article("안녕하세요 잘 부탁드립니다")

 

2. static 멤버 함수는 오직 static 멤버들만 접근가능하다.

이렇게 된 이유는 static멤버는 객체가 생성되기 전에도 사용할 수 있기 때문입니다. 객체가 생성되기 전인데 static 멤버함수를 통해 non-static멤버에 접근을 한다면 생성되지도 않은 변수에 접근을 하는 것이므로 이를 사전에 막은 것이죠.

 

class StaticTest {
	static int a;
	static int getA() { return a; }
public:
	int b;
	int getB() { return b; }
	int f() { return getA(); }
	static int g() { return getB(); } //static멤버함수는 non-static에 접근 불가
	//컴파일 오류
}; //명품 c++ 312p 15번문제

 

3. static 멤버 함수는 this를 사용할 수 없다.

이것도 this포인터의 정의를 생각해보면 납득이 갑니다. this포인터는 "객체 자신에 대한 포인터"입니다. 객체가 없는데 객체를 가리키는 포인터를 사용하는 것은 말이안되죠? 따라서, static에 this를 사용할 수 없도록 제약하였습니다.

 

 


Board 예시

#include<iostream>
#include<string>
using namespace std;

class Board {
public:
	static void add(string plus);
	static void print();
private:
	static string* article;
	static int num;
};

string *Board::article = new string[100];
int Board::num = 0;

void Board::add(string plus) {
	article[num] = plus;
	++num;
}

void Board::print() {
	cout << "************ Board ************" << endl;
	for (int i = 0; i < num; i++) {
		cout << i << ": " << article[i] << endl;
	}

	cout << endl;
}

int main() {
	Board::add("C++은 중요해");
	Board::add("ROS 로봇 프로그래밍할려면 잘 해야해");
	Board::print();
	Board::add("군복무 잘해보자!!");
	Board::print();
	
} // 명품C++ 6장 318p 9번문제

 

 

 

 

'Programming > C,C++' 카테고리의 다른 글

오버라이딩을 통한 다형성의 실현(virtual 개념, 오버라이딩 개념)  (0) 2022.03.01
참조리턴  (0) 2022.02.23
복사생성자  (0) 2022.02.23
연산자 중복  (0) 2022.02.22
함수중복(fuction overloading)  (0) 2022.02.19