title: “C++ 9. static 맴버” categories:

  • CspecialCharspecialChar

    #C++ 9. static 맴버 : 네이버 블로그

static을 아는가?

우선 지역변수와 전역변수에 대해 떠올려 보자

지역변수는 특정한 범위 내에서 작동하는 변수이고 전역변수는 모든 범위에서 사용가능한 변수이다

전역 변수를 먼저 설명하자면

c++소스가 있을 때

int main(){

}

이 있을 것 아닌가?

만약 main()위에 변수가 선언된다면 그것은 전역 변수이다

int a; //a는 전역변수

int main(){

}

전역변수는 프로그램이 끝날 때 소멸하며 모든 범위에서 사용 할 수 있다.

지역변수는 main()같은 함수 내에 있는 변수이다

지역변수는 함수가 끝난 후에 변수가 소멸한다

우리는 함수를 쓰다보면 함수 내에서 계속 누적되는 데이터나

객체를 사용할 때 공통으로 가지는 맴버들이 있을 때가 있다

그럴 때 어느 범위에서든 사용 가능한 전역 변수를 사용하게 되면 변수의 데이터가 언제든지 변경될 수 있는 위험이 있습니다

그래서 우리는 특정 범위에서 계속 유지되는 정적 변수(static)을 사용합니다

static은 선언되면 정해진 범위 내에서만 사용 가능하고 메모리가 끝날 때까지 유지됩니다

예제를 봅시다

#include
#include
using namespace std;
class Person {
 string name;
public:
 Person(string name) {
 this->name = name;
 personNum++;
 }
 static int personNum;
};
int Person::personNum = 0;
int main() {
 Person K("Kim");
 Person L("Lim");
 Person P("Park");
 cout << K.personNum<<endl;
 cout << L.personNum<<endl;
 cout << P.personNum<<endl;
}

Person이라는 클래스가 있습니다

객체들은 K,L,P가 있습니다

사람들이 총 몇명인지 세기 위해서는 Static을 이용해 생성자를 통해 객체가 생성되면 정적 변수인 personNum에 ++를 함으로써 몇 명이 사람이 있는지 알 수 있습니다

중요한 점은 변수를 외부에서 초기화를 시켜야 합니다

클래스 내에서 초기화를 하는 경우 반복문처럼 게속 초기화가 되기 때문에 외부에서 한번만 초기화를 해야 합니다

위에서는 int Person::personNum = 0;을 함으로써 초기화를 했습니다

또 생각해야 할 점은 static함수는 static 맴버들만 접근할 수 있습니다

즉 static이 있으면 컴파일을 하며 static 함수나 맴버를 생성하기 때문에 그 함수가 다른 일반 맴버를 불러온다면 컴파일을 할 때는 생성되지 않은 객체이기 때문에 다른 맴버를 불러올 수 없습니다

즉 static 변수만 만들어졌기 때문에 static맴버 함수는 오직 static맴버만 접근 가능합니다(인자나 리턴)

또 this를 사용할 수 없습니다

자기 자신에 있는 것이 아닌 클래스 선언부 자체에 있으니깐요

위는 공유의 목적으로 static을 사용하였고 캡슐화를 목적으로 맴버 변수를 사용할 수 있습니다

class Math{

public:

static abs(int a){

if(a>0)

return a;

else

return -a;

}

};

라는 클래스가 있다고 합시다

static을 사용하여 Math에는 이미 abs라는 함수가 존재합니다

그러므로 cout«Math::abs(-1)«endl을 하여 Math의 객체를 만들지 않고 자신 자체를 캡슐화 할 수 있습니다

업데이트: