본문 바로가기

Programming/C++

[C++] Static 정적 변수.

이 포스팅은 윤성우님의 열혈 C++ 프로그래밍 책을 기반으로 작성되었습니다.

오늘은  static에 대해서 한 번 얘기해볼까 합니다.
static은 크게는 다음의 용도로 사용됩니다.

1. 전역변수에서 static 선언된 경우. (c/c++)
2. 함수 내에서 static 선언된 경우. (c/c++)
3. 멤버 변수로 static 선언된 경우. (c++)
4. 멤버 함수로 static 선언된 경우. (c++)
5. const static 멤버

먼저 첫 번째의 경우부터 볼게요.
이 경우에는 static이 외부 파일의 접근을 막는 정보은닉의 역할을 합니다.
좀 더 자세하게 말하자면, 전역변수에서 static으로 선언이 되면, 해당 파일 내에서는 자유롭게 참조가 가능하지만 외부 파일에서 해당 파일을 불러와서 사용하고자 할 경우는 참조가 불가능하다는 말입니다.

그럼 이제 두 번째 경우를 볼게요.
이 경우는 아까와는 좀 성향이 달리, 함수 내에서 변수가 static 선언이 되면 함수가 종료하여도 이는 소멸되지 않고 계속 사용이 가능하게 됩니다.

여기까지가 일반적으로 c에서의 static의 기능이라면 c++에서는 또 주목할만한 기능이 있는데요.
바로 세 번째, 멤버 변수로 static 선언이 되는 경우입니다.
이 경우에는 static으로 선언된 멤버변수는 해당 객체 내에서만 접근 가능한 것이 아니라, 프로그램 전체의 다른 객체로부터도 접근이 가능하며, 이는 프로그램 전체적으로 하나만 존재하게 됩니다. 그림으로 그려보면 다음과 같죠.

이는 프로그램 실행과 동시에 초기화되어 메모리에 저장되어 계속 사용됩니다.
static으로 선언되었다해도 멤버변수이기에 static을 멤버변수로 포함하고 있는 객체에서만 접근이 가능하며, 이를 외부에서 사용가능하게 하기 위해서는 public: 선언이 필요하겠지요?

그런데 또 static은 멤버함수에 선언될 수도 있습니다.
이 역시 static 멤버변수와 비슷한 기능을 가지는데요.
한 가지 헷갈릴 수 있는 것은, static 멤버함수는 결국 객체 내에 존재하는 함수가 아니기 때문에 객체를 생성하지 않아도 호출이 가능하다는 것!
때문에 같은 객체의 멤버변수나 멤버함수의 호출이 불가합니다. 따라서 static 멤버함수는 같이 static 선언된 변수나 함수만 호출 가능한 것으로 기능이 제한됩니다.

마지막으로, const static 멤버인데요.
이는 단지 멤버변수로 const static int KOREANUMBER = 82와 같이 정의해주면,
클래스가 생성될 때, 동시에 초기화되어 상수처럼 이용될 수 있습니다. 
하지만, 이는 C++11부터 멤버변수 역시 생성과 동시에 초기화가 가능하기에.. 굳이? 라는 생각이 듭니다.

끝!