정적 변수는 이름이 내포하고 있는 의미 그대로 "정적인" 변수라고 생각하면 좋습니다.
그렇다고 const 변수 처럼 안에 있는 변수의 값을 바꾸지 못해서 정적인게 아니라.
변수가 선언된 위치에 콕 박혀서 움직이지 않는다고 생각하는편이 좋습니다.
Static에 대해 자세하게 설명하기 이전에 Static의 특징을 정리하자면 아래와 같습니다.
1. Static은 서로 다른 파일안에 중복된 이름으로 선언하여도 오류가 발생하지 않는다.
2. Static 변수의 핵심은 외부에서 해당 변수를 쉽게 수정하지 못하게 한다는 점이다.
3. Static 변수는 전역변수와 마찬가지로 데이터 영역을 사용하는 변수이다.
- 데이터 영역은 프로그램 시작과 동시에 할당되며 프로그램 종료시 사라진다
4. Static 변수를 함수내에서 초기화 할경우 최초의 1회만 초기화가 되고
이후에는 예외처리 되어 초기화 되지않는다.
Static은 서로 다른 파일안의 중복된 이름으로 선언하여도 오류가 발생하지 않는다.
Static 변수는 위 코드 처럼 서로 다른 파일에 같은 이름으로 변수를 선언해도 오류가 발생하지 않습니다.
반면, 전역 변수는 위 코드처럼 a라는 변수를 서로 다른 파일에 같은 이름으로 선언시 중복된 변수라는 오류가 발생하게됩니다.
디버그 메세지를 보면 알 수 있듯이 LNK, 링크 단계에서 발생한 오류임을 알 수 있습니다.
이말은 곧, 문법 상으로는 문제가 없었지만 링크단계에서 컴퓨터가 a라는 변수가 어떤건지 확인하는 과정에서 오류가 발생했음을 알 수 있습니다. 컴퓨터 입장에서 같은 이름으로 선언된 변수 a가 여러개 있으면 동작시 어떤 a를 얘기하는건지 모르기 때문에 이러한 오류가 생기게 됩니다.
Static의 경우는 다릅니다
static은 변수 선언과 동시에 변수가 선언된 그 위치에 고정되어 있습니다.
이러한 특징 때문에 static은 컴퓨터가 링크단계에서 중복된 이름을 가지고 있는 변수인 a가 여러개 있더라도
main()에서 호출한 a는 main에서 선언한 a, func에서 호출한 a는 func에서 선언한 a라는 것을 알 수 있어
링크단계에서 혼동이 생기지 않습니다.
위 코드의 실행 결과를 통해 알 수 있듯이
main.cpp에 존재하는 i_Static 변수와 func.cpp에 존재하는 i_Static는 서로 별개의 변수입니다.
아무리 func.cpp 에서 i_Static의 값을 10으로 수정해도 main에 존재하는 i_Static 변수에게 영향을 줄 수 없습니다.
같은 파일안에 서로 다른 함수 안에 static 변수를 선언하여도 그 변수는 서로 다른 변수를 의미합니다.
함수내에서 Static 초기화
6번째 줄 코드를 보면 변수 i_Static을 0으로 초기화 하게 되어있습니다.
그러면 main()함수에서 CountStatic() 함수를 실행 할때마다 0으로 초기화 되어 아무리 실행해도 값이 1이 나올것 같다고 생각할 수 있습니다. 하지만 함수내에서 Staic변수를 초기화 할 경우 최초 1회만 초기화 되고 이후에는 예외처리되어
다시 초기화 되지 않습니다. 이는 C++문법에 기제된 사항이라 기억해두는 것이 좋습니다.
이처럼 정적변수, Static은 선언한 그 위치 안에서만 사용가능 하기 때문에 다른 함수나 파일에서
Static 변수에 접근할 수 없다는 특징을 가지고 있습니다.
또한 중복된 이름으로 선언할 수 있다는 특징도 가지고 있습니다.
따라서 Static을 외부에서 접근하지 못해야하는 값, 누군가와 협업시 다른 누군가가 맘대로 수정하면 안되는 데이터, 실수로 변경하면 안되는 데이터등 적절하게 잘 사용하면 더 좋은 프로그램을 만들 수 있습니다.
추가로 모든파일에서 인식할 수 있는 변수를 선언하고 싶으면, 외부변수 extern을 사용하면 됩니다.
'C++' 카테고리의 다른 글
C++ 포인터 (0) | 2023.11.24 |
---|---|
C++ 외부변수 extern 사용법 (0) | 2023.11.24 |
C++ 헤더 파일에 함수 기능을 구현해 놓지 않는 이유 (0) | 2023.11.09 |
C++ 분할 구현 (헤더 파일) (0) | 2023.11.09 |
C++ 함수 호출(메모리 영역) (0) | 2023.11.05 |