"정적"이라고 말해주는 키워드
_common은 func라는 헤더파일에 딱 붙어서 "정적"으로 있는 변수이다.
( 데이터 영역은 프로그램이 시작하면 존재하고 종료될때 까지 계속 유지함 )
C#은 객체 지향이라
객체 = 속성 + 기능
즉,
속성 = 데이터, 기능 = 메소드
객체 = 데이터 + 메소드
이기 때문에
C#에서의 메소드와 데이터는 class안에 반드시 선언되어야한다.? => 이부분 좀더 자세히
어쨋든 C++에서의 static은 "현재 해당 파일"에만 존재하고 붙어있는 녀석이다.
그린데 #inlcude라는 "전처리기"를 사용하면 어떻게 되냐?
=> 해당 파일을 "복사" 하겠다! 라는 말이다.
그러면 func.h에 있는 static 으로 선언된 녀석이 #include func.h 를 한 녀석들(파일들)에게 다 복사가되어
ex) main.cpp, func.cpp가 #include func.h를 한경우,
main.cpp만의 static int i;가 데이터 영역에 있는 것이고
func.cpp만의 static int i;가 데이터 영역에 있게되어
해당 프로젝트를 빌드 하여도 링킹 단계에서 에러가 발생하지 않는다.
실제로
func.h에 static int _common을 선언하고
cpp_study.cpp에서 해당 값과 주소값을 출력하는 부분 작성한뒤,
func.cpp에 선언되어있는 Add함수 호출하고 있는 상황
stastic int _common의 경우는 살펴보았는데 만약,
전역 변수를 func.h에 int iPint = 10; 이라 선언하고,
cppstudy.cpp, func.cpp에서 #include func.h를 하게되면
해당 링크 참조해서 읽어라
func.cpp에서는 include func.h를 한뒤 static int _common의 값을 cpp_study와 마찬가지로 주소값을 출력하고 값을 출력해보면
주소값이 다른 것을 알 수 있다.
이것은 해당 파일마다의 고유의 static int _common을 가진다.
왜? => #inlcude라는 전처리기를 사용하여 "복사" 만 했기 때문이다.