static은 link의 개념과 scope block의 개념으로 구분되는데
static - link의 개념은
간단하게 internal linkage를 의미하고
아래의 링크를 참고하면 된다
https://motivelessstudy.tistory.com/313
static - scope block의 개념은
일반적인 static과
static member variable/function로 구분된다
1) 일반적인 static
초기화가 단 한 번만 실행된다
#include <iostream>
void func()
{
static int a = 0;
std::cout << a << std::endl;// 계속 0이 출력
}
int main()
{
for (int i = 0; i < 5; i++)
{
func();
}
}
2) static member variable/function
모든 클래스가 하나의 static 변수를 공유한다
#include <iostream>
class A
{
public:
int i;
static int s;
static void func();
};
int A::s = 0;
int main()
{
A a1;
A a2;
A a3;
a1.s = 10;
std::cout << a1.s << std::endl;// 10
std::cout << a2.s << std::endl;// 10
std::cout << a3.s << std::endl;// 10
}
# static의 선언과 정의
// A.h
class A {
public:
static int count; // static 멤버 변수 선언
};
위의 코드를 보면,
count라는 static 멤버 변수를 선언만 했다
이때, count는 실제로 메모리를 차지하지 않고,
단지 A라는 Class에 static 멤버가 있다는 정보만 제공한다
// A.cpp
#include "A.h"
int A::count = 0; // static 멤버 변수 정의
위의 코드를 보면,
count를 정의했으며, 이에 따라 메모리에 할당된다
이렇게 정의를 .cpp 파일에 둠으로써, 링크 타임에 이 정의가 딱 한 번만 존재하게 된다
# static의 header와 cpp
만약 아래와 같이
static에 대한 선언과 정의를 모두 header 파일에 넣게 되면
// A.h
class A {
public:
static int count = 0; // 선언과 정의 모두 헤더에 있음
};
이 헤더 파일(A.h)을 여러 .cpp 파일에서 포함하게 되면,
각 .cpp 파일마다 count 변수가 정의된 것처럼 컴파일러가 처리한다
즉, 각각의 .cpp 파일에 중복으로 정의된 count 변수가 생기고,
링크 단계에서 충돌이 발생합니다.
따라서, static에 대한 정의는 반드시 cpp에 작성해줘야 한다
추가적으로, C++ 17부터는 선언과 정의를 동시에 하는 inline이라는 키워드를 활용할 수도 있다
'C++ > [노코프] Tips' 카테고리의 다른 글
[C++ Tips] Function Overloading (0) | 2024.04.08 |
---|---|
[C++ Tips] 싱글톤 (0) | 2024.04.07 |
[C++ Tips] extern vs. static (0) | 2024.04.07 |
[C++ Tips] std::string (0) | 2024.04.06 |
[C++ Tips] 상속의 문제점 (0) | 2024.04.06 |