개요
안녕하세요. 이번 글에서는 C++의 static 키워드에 대해 알아보겠습니다. static은 쓰이는 위치에 따라 의미가 달라져서 헷갈리기 쉽습니다. 크게 함수 안의 지역 변수, 전역 변수·함수, 클래스 멤버 세 자리에서의 쓰임을 나눠서 정리하겠습니다.
한눈에 보기
| 위치 | static의 의미 |
|---|---|
| 함수 안 지역 변수 | 프로그램 끝까지 값이 유지되고, 딱 한 번만 초기화 |
| 전역 변수·함수 | 그 파일 안에서만 보이게 제한 (내부 링크) |
| 클래스 멤버 | 인스턴스마다가 아니라 클래스 전체가 하나를 공유 |
함수 안 static 지역 변수
함수 안의 지역 변수에 static을 붙이면, 함수가 끝나도 사라지지 않고 값이 유지됩니다. 초기화는 처음 한 번만 실행됩니다.
void counter()
{
static int count = 0; // 처음 한 번만 0으로 초기화
count++;
std::cout << count << " ";
}
int main()
{
counter(); // 1
counter(); // 2
counter(); // 3 ← count가 유지됨
}
static이 없으면 매 호출마다 0으로 다시 시작해 계속 1만 출력됩니다. static이라 값이 누적됩니다.
전역 변수·함수의 static (내부 링크)
파일 범위(전역)의 변수나 함수에 static을 붙이면, 그 파일(.cpp) 안에서만 쓸 수 있고 다른 파일에서는 접근할 수 없게 됩니다. 이름 충돌을 막는 용도입니다.
// a.cpp
static int secret = 10; // a.cpp 안에서만 보임
static void helper() { } // a.cpp 전용 함수
// b.cpp
// extern int secret; // 에러: a.cpp의 secret에는 접근 불가
여러 파일에서 같은 이름의 전역 변수를 각자 쓰고 싶을 때, static으로 서로 간섭하지 않게 할 수 있습니다. (요즘은 익명 namespace도 같은 목적에 쓰입니다.)
클래스의 static 멤버
클래스 멤버에 static을 붙이면, 객체(인스턴스)마다 따로 갖는 것이 아니라 클래스 전체가 하나를 공유합니다. 예를 들어 “지금까지 만들어진 객체 수”처럼 모든 객체가 함께 쓰는 값에 적합합니다.
class Player
{
public:
static int count; // 모든 Player가 공유 (선언)
Player() { count++; }
};
int Player::count = 0; // 클래스 밖에서 한 번 정의(초기화)
int main()
{
Player p1, p2, p3;
std::cout << Player::count; // 3 (클래스 이름으로 접근)
}
static 멤버 변수는 클래스 선언 안에서는 선언만 하고, 클래스 밖에서 한 번 정의(초기화)해야 합니다. 접근은 클래스이름::멤버로 합니다.
static 멤버 함수
멤버 함수에도 static을 붙일 수 있습니다. static 멤버 함수는 특정 객체가 아니라 클래스에 속하므로, 객체 없이 호출할 수 있습니다. 대신 일반 멤버 변수(this)에는 접근할 수 없고, static 멤버만 다룰 수 있습니다.
class Player
{
public:
static int count;
static int GetCount() // 객체 없이 호출 가능
{
return count; // static 멤버만 접근 가능
}
};
int Player::count = 0;
// 객체 없이 클래스 이름으로 호출
std::cout << Player::GetCount();
정리
- 함수 안 지역 변수: 값이 유지되고 한 번만 초기화된다.
- 전역 변수·함수: 그 파일 안에서만 보이게 제한한다(내부 링크).
- 클래스 멤버 변수: 모든 객체가 하나를 공유하며, 클래스 밖에서 한 번 정의한다.
- 클래스 멤버 함수: 객체 없이 호출 가능하고 static 멤버만 접근한다.
같은 static이라도 위치에 따라 “유지 / 파일 한정 / 공유”로 의미가 달라진다는 점만 구분하면 정리됩니다. 이상으로 static 키워드에 대해 간단히 알아보았습니다.