본문 바로가기

Language/C++

Static 변수

static 변수 (함수)

static은 정적 이라는 의미로 C언어에서도 사용이 되고 있는 일종의 전역 변수이다.

이 static개념이 나온 이유는 지역변수를 전역변수처럼 사용하고자 하는 개념으로

나오게 된 것이다.

C++은 객체 지향이라고 하지만 객체지향에서는 전역변수라는게 존재 하지 않는다
그렇기 때문에 완전한 객체지향을 하고자 한다면 전역변수가 없는 프로그램을 만들어야
하는데 그렇게 되면 서로간의 데이터를 주고받는일이 쉽지가 않을것이다. 완벽한 객체지향을
위해서 static 변수를 사용한다.

이 static 변수는 우선 메모리 맵의 시스템 영역에 위치하게되며 매인함수가 만들어지기 전에
이미 지혼자 자리잡고 대기 치고있다. ㅡㅡ ''(이는 전역변수도 마찬가지임을 잊지말자)
그렇게 때문에 멤버라는 개념과는 동떨어진다.

!멤버! 라고 불린다는건 객체가 생성될때 그 객체가 생성된 메모리 영역안에 들어가 있어야지
멤버라고 불릴수 있는데 static 변수 나 함수는 객체가 생성되는 바깥도 아닌 완전 다른 영역
(객체는 힙에 생성이 된다고 하지.ㅡㅡㅋ) 인 시스템에 만들어져서 일종의 공유를 하는 개념이기 때문이다.

이렇게 공유를 하는 것은 물론 멤버 함수도 이런식으로 공유가 가능하지만 멤버함수도 역시 객체가 생성 되면서
함께 만들어지며, 스텍에 만들어 진다는 점이 틀리다.(스텍이 맞나?-_-;; 내가 아는 이론은 함수는 모두 스텍이다!아님 힙이겠지.....무책임!)
또한, static은 객체 단위가 아니라 클래스 단위로 사용되기 때문에 클래스 변수, 클래스 함수 라고 한다.

특징을 정리 한다면....
1.클래스 변수, 클래스 함수라고 한다.
2.main 함수 호출이전에 메모리 공간에 올라가서 초기화
3.선언된 클래스의 객체 내에 직접 접근 허용
4.static 멤버 초기화 문으로 초기화 해야한다.

현재까지 3번까지의 설명은 모두 끝이다. 3번에서 살을좀 더 붙인다면 생성된 모든 곳에서 참조가 다 가능한 것이 아니다.
만일 private 영역 내에서 생성을 한것이라고 한다면 참조가 불가능 하다. 이를 가릴수 있는 권한 이라고 한다.
만일 public 이면? 당연 모든 곳에서 심지어 main함수에서 객체를 생성 하기전에도 참조가 가능하다. 이를 직접 접근 권한이라 한다.

마지막으로 이 변수를 초기화 시킬때 일반적인 멤버 변수와 동일하게 생성자 함수에 넣어버리면, 객체를 생성할때마다 값이 리셋되어
객체가 틀려도 동일한 값을 가지게 된다. 그렇기 때문에 static 멤버 초기화 문으로 초기화를 해야한다.
형식은....자료형     클래스명     ::   변수명   =  초기화 값;  (머냐....ㅋㅋㅋ)

예를 들어 AAA라는 클래스에 siatic변수n를 만들었다고 한다면 int AAA:: n = 0; 이런식이라고나 할까?ㅋㅋㅋ 이는 클래스 블럭 이 끝나기 전에
기제한다.~! 여기까쥐~