static 키워드는 크게 link 와 scope block 와 클래스 멤버 이 3가지 범주의 내용을 가지고 있다.
먼저 link 를 알아보기 위해선 extern 키워드가 따라온다.
cpp 레퍼런스 페이지에서 static 은 internal linkage , extern 은 external linkage 라고 표현하고 있는데,
링크에 관한 내용이기 때문에 컴파일 프로세스를 알아보자.
컴파일을 할 경우 include 되어있는 헤더파일들을 복붙하면서 오브젝트 파일들을 만들어내고 (각각의 translation unit),
각 오브젝트 파일들을 서로 연결시켜주는 역할이 링커이다.
두 소스코드에서 글로벌 변수 a 를 만들었다고 했을 때 각자 오브젝트 파일들을 정상적으로 만들어지지만,
링킹 과정에서 a가 겹쳐 에러가 나게 된다.
이 떄 한쪽 소스코드의 변수 a 에 extern 으로 선언해주면 링킹 과정에서 다른 곳에 정의돼있는 a 를 사용하겠다는 뜻이 된다.
extern 을 쓸 경우에는 a 라는 변수를 외부의 translation unit 에서 가져오겠다는 뜻이고. (external)
static 을 쓸 경우에는 a 라는 변수를 해당 translation unit 내부에서만 사용하겠다는 뜻이 된다. (internal)
글로벌 변수를 사용할 때는 다른 코드들과 충돌이 없도록 웬만해서 static 을 붙여주도록 하자.
다음으로 scope block이다.
로컬 변수는 스택에 선언되고, 동적 할당되는 변수들은 힙에 할당되어 스택에서 가리키고 있어야 한다.
글로벌 변수는 데이터 공간에 선언된다.
이때 글로벌 변수에 static 을 붙여주는 것은 링키지를 internal 하게 강제해주는 역할이다.
마지막 스태틱 멤버는 알고 있는 클래스 별로 하나만 생성되는 흔히 알고 있는 static 이다!
클래스 멤버로 존재하는 static 변수는 데이터 영역에 클래스별로 하나가 생성되고, 모든 객체들이 해당 변수를 공유하는 것이다.
'STUDY > C++' 카테고리의 다른 글
[C++] 배열 형식의 인수 (0) | 2020.06.30 |
---|---|
[C++] const 포인터와 const 로의 포인터? (0) | 2020.06.29 |
[C++] list 를 쓸까? (0) | 2020.05.22 |
[C++] 배열과 벡터? (0) | 2020.05.21 |
[C++] 헤더파일과 소스파일 (0) | 2020.05.17 |