728x90
static
- C++에서 static 키워드는 쓰이는 상황에 따라 여러 의미를 갖는다.
- 소스파일(.cpp 파일)에 전역 변수 및 함수를 static으로 선언하면 private의 의미를 갖는다.
- 클래스 멤버 변수를 static으로 선언하면 클래스의 모든 인스턴스가 공유하는 전역 변수의 의미를 갖는다.
- 함수의 지역 변수를 static으로 선언하면 해당 함수가 여러 번 호출되더라도 한 번만 초기화되며 함수 호출 사이의 그 값이 유지된다.
| 소스파일(.cpp) | private 변수, 함수 |
| 클래스 멤버 변수 | 클래스의 모든 인스턴스가 공유 |
| 함수의 지역 변수 | 한 번만 초기화, 해당 함수가 여러 번 호출되어도 그 값이 유지됨 |
전역 변수 및 함수의 static
- 전역 변수와 함수에 static 키워드를 추가하면 해당 변수나 함수의 “링크 가능성(Linkage)”이 해당 파일 내부로 제한된다.
- 이를 통해 클래스의 private과 비슷한 효과를 얻을 수 있고, 정보 은닉이 필요한 경우에 활용할 수 있다.
// Static.h
// 아래 variable 변수는 다른 파일에서는 접근이 불가능하다.
#pragma once
static int variable = 0;
// File1.h
#pragma once
void FileOneFunction();
// File1.cpp
#include "File1.h"
#include <iostream>
#include "Static.h"
void FileOneFunction()
{
++variable;
std::cout << "File1, variable: " << variable << "\n";
}
// File2.h
#pragma once
void FileTwoFunction();
// File2.cpp
#include "File2.h"
#include <iostream>
#include "Static.h"
void FileTwoFunction()
{
++variable;
std::cout << "File2, variable: " << variable << "\n";
}
// Main.cpp
#include <iostream>
#include "File1.h"
#include "File2.h"
int main()
{
FileOneFunction();
FileTwoFunction();
}

- variable은 static으로 선언했기 때문에 전역 변수라고 생각할 수 있고, 이렇게 생각한다면 첫 번째 함수 호출 시 1로 증가한 뒤 두 번째 함수 호출 시 2로 증가해야 할 것 같은데 둘 모두 1이 출력된 것을 볼 수 있다.
- File1.cpp와 File2.cpp에 각각 variable이 선언된 것과 같은 방식으로 동작한다.
- 이때 File1.cpp와 File2.cpp의 variable은 이름은 같지만 다른 변수로 취급된다.
지역 변수에서의 static
- 함수 안에서 static 지역 변수를 선언할 수 있다.
- 함수 안에 static 지역 변수를 선언하면, 한 번만 초기화되며 함수를 호출할 때마다 이전 값을 사용할 수 있다.
- 이 변수는 프로그램이 종료될 때까지 수명을 유지한다.
#include <iostream>
void IncreaseCount()
{
static int count = 0;
++count;
std::cout << "Count: " << count << "\n";
}
int main()
{
IncreaseCount();
IncreaseCount();
IncreaseCount();
}

- main 함수에서 IncreaseCount() 함수를 3번 호출했다.
- 결과를 확인해보면, count 변수가 매번 초기화되지 않고, 값을 유지해 출력되는 것을 확인할 수 있다.
클래스와 static
클래스에서 전역 변수가 필요한 상황
- 객체가 생성될 때 마다 "n번째 객체가 생성되었습니다"라는 메시지를 출력하는 클래스가 있다고 하자.
- 이를 구현하기 위해서는, 불가피하게 모든 객체가 사용할 수 있는 전역 변수를 선언해야 한다.
이럴 때 사용할 수 있는 키워드가 static 키워드이다.
클래스 객체 내부에 static 으로 변수를 선언하면, 모든 인스턴스가 동일한 변수를 사용할 수 있다. 따라서 전역 변수를 선언한 것과 같은 효과를 얻을 수 있다.
다만, static 멤버 변수는 객체에 종속되지 않기 때문에, 외부에서 따로 초기화를 진행해줘야 한다.
class Person
{
public:
Person() { count++; }
private:
static int count; // static 멤버 변수 선언.
};
// static 멤버 변수 초기화.
// static 변수는 객체에 종속되지 않기 때문에 따로 초기화를 진행해야 한다.
int Person::count = 1;
int main()
{
Person person1 = Person();
Person person2 = Person();
}
static 멤버 변수
- static 멤버 변수는 여러 객체(인스턴스)가 공유한다.
- 위 예제에서 Person 클래스에 있는 count 변수는 static으로 선언했기 때문에 모든 객체가 count 변수를 하나만 생성하고 이를 공유한다.

- static 멤버 변수는 main 함수가 호출되기 전에 메모리 공간에 올라가서 초기화된다.
- 따라서 public으로 선언이 된다면 객체 생성 이전에도 접근이 가능하다.
- 객체의 멤버로 존재하는 것이 아니다. 다만, 선언되어 있는 클래스 내에서 직접 접근할 수 있는 권한이 부여된다.
- 객체에 멤버로 존재하지 않기 때문에 생성자에서 초기화할 수 없다. 따라서 별도의 static 멤버 초기화 문법을 사용해 초기화를 진행해야 한다.
728x90
'📕Programming > 📝C/C++' 카테고리의 다른 글
| [C / C++] C++ 스타일 파일 입출력 (0) | 2025.07.24 |
|---|---|
| [C / C++] C 스타일 파일 입출력 (0) | 2025.07.23 |
| [C / C++] RTTI (0) | 2025.07.23 |
| [C / C++] 스택 & 힙 메모리 할당 과정 (0) | 2025.07.20 |
| [C / C++] 동적 라이브러리 (dynamic link library) (0) | 2025.07.18 |