본문 바로가기
C++ 200제/코딩 IT 정보

C++ Static 정적 클래스, 멤버 변수, 객체, 함수 4가지 예제

by vicddory 2018. 7. 6.

C++ Static 정적 클래스, 멤버 변수, 객체, 함수 4가지 예제


C++에서 Static은 특별한 성질을 할당하는 키워드입니다. static 요소들은 프로그램이 실행되고 종료될 때 까지(program lifetime) 저장 영역에 단 한 번만 저장됩니다.


static 키워드는 다음과 같은 4가지 유형으로 사용됩니다.


1. 함수의 정적 변수 (Static variable in functions, static 변수)

2. 정적 클래스 객체 (Static Class Objects, static 클래스 객체)

3. 클래스 내부의 정적 멤버 변수 (Static member Variable in class, static 멤버 변수)

4. 클래스 내부의 정적 함수 (Static Methods in class, static 멤버 함수)

1. 함수의 정적 변수 (Static variable in functions, static 변수)

static 변수는 함수 내부에서 단 한 번만 초기화되고 그 값은 계속 유지됩니다.

static 변수는 변수 저장 영역이 아닌, 정적 저장 영역에 저장됩니다. (스택 영역에 저장되지 않습니다)


1
2
3
4
5
6
7
8
9
10
11
12
13
void counter()
{
    static int count = 0;
    cout << count++;
}
 
int main(0
{
    for(int i = 0; i < 5; i++)
    {
        counter();
    }
}
cs


Output :


0 1 2 3 4


이젠 static 변수를 빼고 같은 프로그램을 확인해 보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
void counter()
{
    int count = 0;
    cout << count++;
}
 
int main(0
{
    for(int i = 0; i < 5; i++)
    {
        counter();
    }
}
cs


Output :


0 0 0 0 0


static 키워드를 사용하지 않은 count 변수는 함수가 호출될 때마다 초기화되어 출력값은 계속 0입니다. 하지만, static 변수는 mina() 함수가 종료되기 전까지 값을 유지합니다.


static 변수를 따로 초기화하지 않으면 0 값을 갖게 됩니다.

2. 정적 클래스 객체 (Static class Objects, static 클래스 객체)

static 키워드는 클래스 객체에서도 똑같이 동작합니다. static으로 선언된 객체 또한 정적 저장 영역에 저장되어 프로그램이 끝날 때까지 유지됩니다.


static 객체는 다른 객체처럼 생성자를 사용하여 초기화합니다.


C++ static 정적 클래스 함수[C++ static keyword]


기본값 0으로 초기화되는 것은 일반 데이터 유형이며 사용자가 정의한 객체에는 해당하지 않습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Abc
{
    int i;
 
public:
    Abc()
    {
        i = 0;
        cout << "constructor";
    }
 
    ~Abc()
    {
        cout << "destructor";
    }
};
 
void f()
{
    static Abc obj;
}
 
int main()
{
    int x = 0;
 
    if (x == 0)
    {
        f();
    }
 
    cout << "END";
}
cs


Output :


constructor END destructor


이런 생각이 들지 않나요?

왜 if() 문이 끝날 때 소멸자가 호출되지 않았을까?

이유는 객체가 static으로 선언되었기에 프로그램이 종료되기 전엔 객체 또한 없어지지 않습니다. 그래서 main() 함수가 끝날 때 소멸자가 호출된 것입니다.


3. 클래스 내부의 정적 멤버 변수 (Static member Variable in class, static 멤버 변수)

클래스 내부의 정적 멤버 변수는 모든 개체에서 공유합니다. static 멤버 변수는 한 곳에서만 저장되며 다른 데이터 멤버(non static)와 같이 각 객체에 별도로 복사할 순 없습니다.


정적 멤버 변수(static 변수)는 생성자에서 초기화되지 않으며, 객체 초기화에 종속되지 않아 명시적으로 클래스 외부에서 값을 할당합니다. 초기화되지 않으면 링커에서 오류가 발생합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class X
{
    static int i;
 
public:
    X(){};
};
 
int X::i = 1;
 
int main()
{
    X obj;
 
    cout << obj.i;   // prints value of i
}
cs


정적 데이터 멤벼 변수는 한 번만 정의할 수 있으며, 다른 값으로 재할당은 불가능합니다. 또한, 산술 연산 시 이용할 수 있습니다.


C++ static 변수 함수 객체[C++ static keyword]


4. 클래스 내부의 정적 함수 (Static Methods in class, static 멤버 함수)

이 함수는 클래스 객체가 아닌 모든 클래스에서 사용합니다.


직접적으로 함수를 호출하려면 . 연산자를 사용합니다. 하지만 클래스 이름과 영역 때문에 :: 연산자를 사용하는 것이 일반적입니다.


1
2
3
4
5
6
7
8
9
10
class X
{
public:
    static void f() { };
};
 
int main()
{
    X::f(); // calling member function directly with class name
}
cs


이런 정적 함수는 다른 함수에 접근할 수 없으며 static으로 선언된 함수와 변수에만 접근할 수 있습니다.


출처 : study tonight - static keword [링크]

C++ Static 정적 클래스, 멤버 변수, 객체, 함수 4가지 예제

댓글