C++ 9. static 맴버
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의 객체를 만들지 않고 자신 자체를 캡슐화 할 수 있습니다