스택영역 : 함수가 호출될 때 사용하는 메모리 영역
(함수가 선언될 때 그 안의 지역변수도 포함이 되기 때문에 지역변수가 사용하는 메모리 영역으로 봐도 괜찮음)
데이터 영역 : 전역변수가 사용하는 메모리 영역
(전역변수, 정적변수, 외부변수 전부 이 영역을 사용함)
데이터 영역은 main 함수가 호출될 때, 즉 프로그램이 시작될 때 만들어짐
이 영역은 스택영역과는 별개임 (당연한 것), 그러니 프로그램이 종료될 때까지 전역변수는 사라지지 않음
main 함수 내부에 선언한 변수도 결국은 지역변수, 아예 완전히 바깥에 있는 것이 전역변수임, 헷갈리지 말것
정적 지역 변수 (static) : 특정 지역 (함수) 내에서만 접근 가능한 전역변수라고 보면 됨
정적 지역 변수의 함수 초기화 : 정적 지역 변수는 프로그램 시작시 0으로 초기화 되며 이후 함수로 초기화 될때 한번 더 초기화가 이루어짐, 따라서 초기화가 2번 이루어지는 것
#include <iostream>
void countCalls() {
static int count = 0; // 정적 지역 변수
count++;
std::cout << "함수 호출 횟수: " << count << std::endl;
}
int main() {
countCalls(); // 출력: 함수 호출 횟수: 1
countCalls(); // 출력: 함수 호출 횟수: 2
countCalls(); // 출력: 함수 호출 횟수: 3
return 0;
}
정적 전역 변수 : 전역 변수와 같지만 사용 범위를 소스파일 내로 제한한 것 같음 (다른 파일에서 사용 불가능)
#include <iostream>
static int globalCount = 0; // 정적 전역 변수
void countCalls() {
globalCount++;
std::cout << "전역 호출 횟수: " << globalCount << std::endl;
}
int main() {
countCalls(); // 출력: 전역 호출 횟수: 1
countCalls(); // 출력: 전역 호출 횟수: 2
countCalls(); // 출력: 전역 호출 횟수: 3
return 0;
}
외부 변수 : 다른 파일에서 사용 가능
#include <iostream>
extern int sharedVar; // 외부 변수 선언
void printSharedVar() {
std::cout << "외부 변수: " << sharedVar << std::endl;
}
#include <iostream>
int sharedVar = 0; // 외부 변수 정의와 초기화
void incrementSharedVar() {
sharedVar++;
}
#include <iostream>
extern int sharedVar; // 외부 변수 선언
int main() {
sharedVar = 5; // 외부 변수 초기화
incrementSharedVar(); // sharedVar 값 증가
printSharedVar(); // 출력: 외부 변수: 6
return 0;
}
설명
수정된 예시 코드에서 extern 키워드가 추가되었습니다.
외부 변수인 sharedVar는 File2.cpp에서 정의되어 초기화됩니다. 그리고 File1.cpp와 main.cpp에서는 sharedVar를 사용하기 위해 extern 키워드로 선언됩니다.
File1.cpp에서는 extern int sharedVar;를 통해 sharedVar가 다른 파일에서 정의된 외부 변수임을 알려줍니다.
이렇게 선언된 외부 변수를 사용하여 printSharedVar() 함수에서 sharedVar의 값을 출력합니다.
File2.cpp에서는 int sharedVar = 0;로 외부 변수 sharedVar를 정의하고 초기화합니다.
main.cpp에서는 extern int sharedVar;로 외부 변수 sharedVar를 선언하고, sharedVar를 사용하여 값을 변경하고 printSharedVar() 함수를 호출하여 출력합니다.
이제 각 파일은 올바르게 외부 변수를 선언하고 사용하여 데이터를 공유할 수 있게 됩니다.