C++에서 static 키워드는 변수, 데이터 멤버 또는 함수에 적용될 수 있으며, static으로 선언된 요소는 프로그램이 종료될 때까지 메모리에 유지됩니다. 특히 static 멤버 함수는 객체를 생성하지 않고도 클래스 이름을 통해 직접 호출할 수 있다는 점이 큰 특징입니다.
static 변수의 주요 특징
static 변수는 프로그램 실행 중 단 한 번만 초기화되며, 컴파일러는 이 변수를 프로그램이 끝날 때까지 유지합니다. static 변수는 함수 내부 또는 외부 어디에서든 정의할 수 있지만, 선언된 블록 내에서만 지역적으로 접근 가능합니다.
또한 static 변수는 별도로 초기화하지 않으면 기본값으로 0이 자동으로 설정되며, 프로그램 실행이 종료될 때까지 생명주기를 유지합니다.
static 키워드 문법
static 데이터타입 변수명 = 값; // static 변수
static 반환타입 함수명() { // static 함수
...
}각 구성 요소의 의미는 다음과 같습니다.
- 데이터타입 - int, char, float 등 변수의 자료형
- 변수명 - 사용자가 지정하는 변수의 이름
- 값 - 변수를 초기화하는 값으로, 생략 시 기본값은 0
- 반환타입 - 함수가 반환하는 값의 자료형
- 함수명 - 사용자가 지정하는 함수의 이름
예제 코드
다음은 static 키워드를 활용한 예제입니다.
#include <bits/stdc++.h>
using namespace std;
class Base {
public : static int val;
static int func(int a) {
cout << "\nStatic 멤버 함수가 호출되었습니다";
cout << "\na의 값 : " << a;
}
};
int Base::val = 28;
int main() {
Base b;
Base::func(8);
cout << "\nstatic 변수의 값 : " << b.val;
return 0;
}실행 결과
Static 멤버 함수가 호출되었습니다 a의 값 : 8 static 변수의 값 : 28
코드 설명
위 예제에서는 클래스 내부에 static 변수와 static 멤버 함수를 다음과 같이 선언했습니다.
public : static int val;
static int func(int a) {
cout << "\nStatic 멤버 함수가 호출되었습니다";
cout << "\na의 값 : " << a;
}클래스 정의 이후, main() 함수 이전에 static 변수를 범위 지정 연산자(::)를 사용해 초기화합니다. static 멤버 변수는 클래스 내부에서 선언만 가능하고 반드시 클래스 외부에서 초기화해야 한다는 점에 유의하세요.
int Base::val = 28;
main() 함수에서는 Base 클래스의 객체를 생성한 뒤 static 변수에 접근하고, static 함수는 객체 없이 클래스 이름만으로 직접 호출합니다.
Base b; Base::func(8); cout << "\nstatic 변수의 값 : " << b.val;
정리
static 키워드를 잘 활용하면 프로그램 전체에서 공유되는 데이터를 관리하거나, 객체 생성 없이 유틸리티 성격의 함수를 제공할 수 있습니다. 다만 static 변수는 프로그램 종료 시까지 메모리에 상주하므로, 불필요하게 남용하면 메모리 효율성이 떨어질 수 있다는 점을 고려해 설계하는 것이 좋습니다.