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