컴퓨터 언어/C++

[C++] C++ 19일차 static(정적) 클래스와 지역 정적(static)클래스 1강

훈츠 2020. 4. 23. 17:18
반응형

 

안녕하세요. 훈츠입니다. 금일은 static 클래스와 지역 static 클래스에 관해 포스팅 합니다.

 

정적 클래스 (static class)

 

  • 한번 생성과 초기화 ( 스태틱 메모리 영역에 저장)
  • 프로그램이 종료될 때 까지 소멸되지 않는다.
  • 정적 클래스를 객체화 하면 내용을 공유 한다.

 

 

형식 ( has - a 관계 )

  • 클래스안에 A 클래스를 정적(static) 변수로 선언
    • Main 함수 밖에서 선언 해야 하며 형식은 다음과 같습니다.
    • A B::ClassA(10);
  • 함수안에서 A 클래스를 정적(static) 변수로 선언
    • void Set(int nVar { static A test(nVar);

예제 코드

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
class A
{
//private: 
    //int m_nVar;
public:
    int m_nVar;
    A(int nVar) {
        m_nVar = nVar;
        cout<<"A생성자 호출 : " << m_nVar <<endl;
    }
    ~A() {
        cout << "A소멸자 호출 " << endl;
    }
    void Print() {
        cout <<"A Print: "<< m_nVar << endl;
    }
    
};
 
//클래스안에 정적 클래스
class B {
    
public:
    static A ClassA;
    B() { cout << "B생성자 호출 " << endl; }
    ~B() { cout << "B소멸자 호출 " << endl; }
    
};
 
//지역 함수안에 클래스
void Set(int nVar) {
    static A test(nVar);
    cout << "Set 함수호출 " << endl;  //지역 클래스 
}
 
A B::ClassA(10); //A 생성자 호출 10 (1번)
 
int main()
{
 
    Set(5);  //A 생성자 호출 (2번) // Set 함수 호출 (3번)
    Set(20); //호출 안됨. 
 
    B test1, test2; //두개의 B 클래스의 test1, test2 인스턴스 
    test1.ClassA.Print();  //B 클래스의 test1 인스턴스지만 , A클래스의 (1번)에서 초기화된 10이 호출 
    test2.ClassA.Print();  //B 클래스의 test2 인스턴스지만 , A클래스의 (1번)에서 초기화된 10이 호출 
    
    test1.ClassA.m_nVar = 30;//값을 변경하였지만 역시 
    test1.ClassA.Print(); //호출값이 같음. 
    test2.ClassA.Print();  //B 클래스의 test2 인스턴스지만 , A클래스의 (1번)에서 초기화된 10이 호출 
    
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

예제 코드의 실행 결과를 보면 클래스에서 정적(static) 변수로 선언한것도, 함수안에서 정적(static) 변수로 선언한것도 모두 A 생성자 호출 :10, 5 한번씩만 호출되고, 그밑에 Set(20)은 이미 정적변수가 생성되었기 때문에 호출되지 않을것을 확인 할수 있습니다.

Has-a 관계로 정적변수로 선언후 사용할때는 한번의 생성과 초기화만 이루어 지기 때문입니다.

B test1, test2 또한 마찬가지로 두개의 인스턴스를 생성했지만 안에 있는 정적변수를 호출했기 때문에 결과값이 같은것을 확인 할수 있습니다.

 

 

 

반응형