Static (C++)
static 키워드는 변수, 함수, 클래스 데이터 멤버 및 클래스 함수를 선언하는 데 사용할 수 있습니다.
기본적으로 모든 블록 외부에 정의된 개체 또는 변수에는 정적 지속 기간 및 외부 링크가 있습니다. 정적 생존 기간이란 프로그램이 시작될 때 개체 또는 변수가 할당되고 프로그램이 끝날 때 개체 또는 변수가 할당 취소됨을 의미합니다. 외부 연결은 변수가 선언된 파일 외부에서 변수 이름이 표시됨을 의미합니다. 반대로 내부 연결은 변수가 선언된 파일 외부에 이름이 표시되지 않음을 의미합니다.
static 키워드는 다음 상황에서 사용할 수 있습니다.
파일 범위(전역 및/또는 네임스페이스 범위)에 변수 또는 함수를 선언한 경우, static 키워드는 변수 또는 함수에 내부 링크가 있음을 지정합니다. 변수를 선언할 때 변수가 정적 생존 기간을 가지며, 다른 값을 지정하지 않으면 컴파일러가 0으로 초기화합니다.
함수에 변수를 선언하는 경우, static 키워드는 해당 함수 호출 간 변수의 상태가 유지되도록 지정합니다.
클래스 선언에서 데이터 멤버를 선언하는 경우, static키워드는 멤버의 복사본 하나가 클래스의 모든 인스턴스에 공유되도록 지정합니다. 정적 데이터 멤버는 파일 범위에서 정의되어야 합니다. const static으로 선언되는 정수 계열 데이터 멤버는 이니셜라이저를 가질 수 있습니다.
클래스 선언에서 데이터 멤버를 선언하는 경우, static 키워드는 해당 함수가 클래스의 모든 인스턴스에 공유되도록 지정합니다. 정적 멤버 함수는 암시적 this 포인터가 없기 때문에 인스턴스 멤버에 액세스할 수 없습니다. 인스턴스 멤버에 액세스하려면 인스턴스 포인터나 참조인 매개 변수로 함수를 선언해야 합니다.
공용 구조체의 멤버는 정적 상태로 선언할 수 없습니다. 하지만 전역으로 선언된 익명 공용 구조체는 static으로 명시적으로 선언해야 합니다.
자세한 내용은 auto, extern 및 register를 참조하십시오.
예제
다음 예제에서는 함수에서 선언된 static 변수가 해당 함수 호출 간에 상태를 유지하는 방법을 보여 줍니다.
// static1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
void showstat( int curr ) {
static int nStatic; // Value of nStatic is retained
// between each function call
nStatic += curr;
cout << "nStatic is " << nStatic << endl;
}
int main() {
for ( int i = 0; i < 5; i++ )
showstat( i );
}
다음 예제에서는 static을 클래스에서 사용하는 방법을 보여 줍니다.
// static2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class CMyClass {
public:
static int m_i;
};
int CMyClass::m_i = 0;
CMyClass myObject1;
CMyClass myObject2;
int main() {
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
myObject1.m_i = 1;
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
myObject2.m_i = 2;
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
CMyClass::m_i = 3;
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
}
다음 예제에서는 멤버 함수에서 static으로 선언된 지역 변수를 보여 줍니다. 정적 변수는 전체 프로그램에서 사용할 수 있으며 해당 형식의 모든 인스턴스는 정적 변수의 동일한 복사본을 공유합니다.
참고
다중 스레드 응용 프로그램에서 정적 로컬 변수에 값을 할당하는 것은 스레드에 안전하지 않으며 프로그래밍 방법으로 권장하지 않습니다.
// static3.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
struct C {
void Test(int value) {
static int var = 0;
if (var == value)
cout << "var == value" << endl;
else
cout << "var != value" << endl;
var = value;
}
};
int main() {
C c1;
C c2;
c1.Test(100);
c2.Test(100);
}