c++ 에서의 static / mutable

‍정진철·2022년 9월 10일
0

C++

목록 보기
14/18

출처: 윤성우의 열혈 C++ 프로그래밍

  • 함수 내 선언된 static의 의미
    -> 한번만 함수내에서 초기화되고, 함수밖을 빠져나가도 소멸되지 않는다.


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

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

  • 위의 코드에 선언된 static 변수 simObjCnt는 SoSimple 객체가 생성될 때 마다 함께 생성되어 객체별로 유지되는 변수가 아님.

  • 객체의 생성 갯수와 관계없이 메모리 공간에 딱 '하나'만 할당되어 공유되는 변수.

  • 즉, SoSimple sim1,2,3 ... 등과같이 객체가 아무리 많이 생성된다 한들 이들이 공유하는 static 변수는 오직 하나이다.

  • 따라서 각 객체의 멤버함수(생성자)에서는 simObjCnt에 멤버변수에 접근하듯이 접근 가능.

  • 하지만 그렇다고 해당 객체 내에 simObjCnt(static 변수)가 존재하는것은 아니고 위치는 객체 외부에 있고 다만 객체에게 멤버변수처럼 접근할 수 있는 권한을 줬을 뿐이다.


#include <iostream>
using namespace std;

class SoSimple
{
private:
    static int simObjCnt; // static 멤버변수, 클래스변수
public:
    SoSimple()
    {
        simObjCnt++;
        cout << simObjCnt << "번째 SoSimple 객체 " << endl;
    }
};

int SoSimple::simObjCnt = 0; // static 멤버변수의 초기화!

class SoComplex
{
private:
    static int cmxObjCnt;

public:
    SoComplex()
    {
        cmxObjCnt++;
        cout << cmxObjCnt << "번째 SoComplex 객체" << endl;
    }
    SoComplex(SoComplex &copy)
    {
        cmxObjCnt++;
        cout << cmxObjCnt << "번째 SoComplex 객체" << endl;
    }
};
int SoComplex::cmxObjCnt = 0;

int main(void)
{
    SoSimple sim1;
    SoSimple sim2;

    SoComplex cmx1;
    SoComplex cmx2 = cmx1;
    SoComplex();
    return 0;
}

  • simObjCnt 변수는 SoSimple 내에 선언된 static 변수이므로 SoSimple 객체의 의해 공유된다.
  • SoSimple의 생성자 내에서 static 변수를 마치 멤버변수인 것 마냥 접근가능. (하지만 static 변수가 멤버변수인 것은 아님)
  • int SoComplex::simObjCnt = 0; 와같이 static 변수의 초기화는 생성자가 아닌 클래스 외부에서 초기화 필요.

static 멤버변수의 또 다른 접근방법

  • static 변수가 선언된 외부에서 접근가능 하려면 public으로 선언이 되야함.


static 멤버함수

static 멤버함수역시 static 멤버변수와 동일.

  • 선언된 클래스의 모든 객체가 공유.
  • public 으로 선언이 되면 클래스의 이름을 이용해서 호출이 가능하다.
  • 객체의 멤버로 존재하는 것은 아니다.

-> static 멤버함수는 객체의 멤버가 아니므로 애초에 클래스의 멤버변수에 접근하는것이 불가.

정리: static 멤버함수 내에서는 static 멤버변수와 static 멤버함수만 호출가능.


const static 멤버와 mutable

  • static 으로 선언시 별도의 초기화 과정을 거쳐야하지만 앞에 const를 붙여쓸 경우 선언과 동시에 초기화 가능.
  • 따라서 const static 멤버변수는 클래스가 정의될 때 지정된 값이 유지되는 상수 이므로 초기화가 가능하다.

mutable

  • const로 선언된 함수임에도 불구하고 mutable로 선언된 변수는 접근과 값의 변경 동시에 가능.

profile
WILL is ALL

0개의 댓글