C++에서의 static

Programming/C++ 2012. 5. 30. 14:46 |

C언어에서의static


1. 전역변수에 선언된 static의 의미 -> 선언된 파일 내에서만 참조를 허용하겠다는 의미.

2. 함수 내에 선언된 static의 의미 -> 한번만 초기회되고, 지역변수와 달리 함수를 빠져나가도 소멸되지 않는다.




C++에서의 static


- static 멤버변수(클래스 변수)


static 멤버변수는 "클래스 변수"라고도 한다. 일반적인 멤버변수와 달리 클래스당 하나씩만 생성되기 때문이다.




멤버변수에 선언된 static 변수는 객체를 생성하건 생성하지 않건, 메모리 공간에 딱 하나만 할당이 되어서 공유되는 변수이다.

이 변수는 객체 내에 존재하는 것이 아니다. 변수는 외부에 있다. 다만 객체에게 멤버변수처럼 접근할 수 있는 권한을 줬을 뿐이다.


static 멤버변수 초기화


: static멤버변수는 생성자에서 초기화하기 못한다. 왜냐면, static 멤버변수는 객체기 생성될 때 동시에 생성되는 변수가 아니고, 이미 메모리 공간에 할당이 이뤄진 변수이다. 그래서 static 멤버변수의 초기화 문법은 다음거과 같이 별도로 정의되어있다. 

int SoSimple::simObjCnt=0;


이는 SoSimple 클래스의 static멤버변수 simObjCnt가 멤모리 공간에 저장될 때 0으로 초기화하라는 뜻이다.




14행: static 멤버변수는 항상 이렇게 초기화가 이뤄짐.


18행: 현재 객체를 하나도 생성하지 않은 상태이다 . 그럼에도 불구하고 클래스의 이름을 이용해서 static멤버변수에 접근하고 있다. 이는 멤버변수가 객체 내에 존재하지 않은을 증명하는 내용이다.

즉, public으로 선언된 static멤버는 이런 식으로 어디서든 접근이 가능하다.


23, 24행: sim1, sim2를 이용해서도 static멤버변수에 접근이 가능하다. 하지만 이러한 형태의 접근은 멤버변수에 접근하는 것과 같은 오해를 불러일으키기 때문에 별로 추천하지 않는다.


const static멤버변수


const를 사용하면 클래스에서 이런식으로 가능해짐.



※ const static 멤버변수는 클래스가 정의될 때 지정된 값이 유지되는 상수이기 때문에, 위 예제에서 보이는 바와 같이 초기화가 가능하도록 문법으로 정의하고 있다.




- static 멤버함수


: static 멤버함수 역시 그 특성이 static 멤버변수와 동일하다.


1. 선언된 클래스의 모든 객체기 공유한다.

2. public으로 선언이 되면, 클래스의 이름을 이용해서 호출이 가능하다.

3. 객체의 멤버로 존재하는 것이 아니다.


"static 멤버함수 내에서는 static 멤버변수와 static멤버함수만 호출이 가능하다."




키워드 mutable


const와 explicit 키워드 이 둘은 나름의 의미가 있으며, 매우 유용하게 사용되는 키워드들이다. 그런데 mutable 키워드는 사용의 빈도수가 낮은 , 아니 가급적 사용의 빈도수를 낮춰야 하는 키워드이다.


"const 함수 내에서의 값의 변경을 예외적으로 허용한다."



※ mutable의 과도한 사용은 C++에 있어서 그 중요성을 인정받은 키워드인 const의 선언을 의미 없게 만들어버린다.

Posted by scii
: