C++

C++ 정적 키워드 총정리

김구티2 2024. 2. 20. 19:25

1. 정적 키워드(Static Keywords)의 개념

정적 키워드는 다양한 유형과 함께 사용될 때 다른 의미를 갖는다. 정적 키워드는 아래와 같이 사용할 수 있다.

① 정적 변수: 함수의 변수, 클래스의 변수
② 클래스의 정적 멤버: 클래스 객체 및 기능 

 

이제 Static이라는 것이 어떤 용도로 쓰이는지 이해해 보자.

2. 정적 변수(Static Variables)

변수가 정적인 것으로 선언되면 프로그램의 수명 동안 해당 변수에 대한 공간이 할당된다. 함수를 여러 번 호출하더라도 정적 변수에 대한 공간은 한 번만 할당되고, 이전 호출에서 변수의 값은 다음 함수 호출을 통해 전달된다. 이는 C나 C++ 또는 이전 함수 상태를 저장해야 하는 다른 응용 프로그램에서 협동 루틴을 구현하는 데 유용하다.

 

예시:

// C++ program to demonstrate
// the use of static Static
// variables in a Function
#include <iostream>
#include <string>
using namespace std;

void demo()
{
     // static variable
     static int count = 0;
     cout << count << " ";

     // value is updated and
     // will be carried to next
     // function calls
     count++;
}

int main()
{
     for (int i = 0; i < 5; i++)
          demo();
     return 0;
}

 

출력:

0 1 2 3 4

 

위 프로그램에서 변수 카운트가 static으로 선언되는 것을 볼 수 있다. 그래서 그 값은 함수 호출을 통해 전달된다. 함수가 호출될 때마다 변수 카운트가 초기화되지 않는 것도 확인할 수 있다.

여기서 또 하나 구분해서 알아야 하는 것은 클래스 내에 있는 정적 변수이다. 클래스의 정적 변수는 별도의 정적 저장소에 공간이 할당되어 한 번만 초기화되므로 클래스의 정적 변수는 개체가 공유한다. 다른 개체에 대해 동일한 정적 변수의 복사본이 여러 개 있을 수 없다. 또한, 이러한 이유로 정적 변수는 생성자를 사용하여 초기화할 수 없다.

 

예시:

// C++ program to demonstrate static
// variables inside a class

#include <iostream>
using namespace std;

class GfG {
public:
     static int i;

     Guti(){
          // Do nothing
     };
};

int main()
{
     Guti obj1;
     Guti obj2;
     obj1.i = 2;
     obj2.i = 3;

     // prints value of i
     cout << obj1.i << " " << obj2.i;
}

 

출력:

undefined reference to 'Guti::i'
collect2: error: ld returned 1 exit status

 

위의 프로그램에서 여러 개체에 대해 정적 변수 i의 복사본을 여러 개 생성하려고 시도한 것을 볼 수 있다. 그러나 이러한 일은 일어나지 않았다. 따라서 클래스 내부의 정적 변수는 아래와 같이 클래스 이름과 범위 해결 연산자를 사용하여 사용자가 명시적으로 초기화해야 한다.

 

예시:

// C++ program to demonstrate static
// variables inside a class

#include <iostream>
using namespace std;

class Guti {
public:
     static int i;

     Guti(){
          // Do nothing
     };
};

int Guti::i = 1;

int main()
{
     Guti obj;
     // prints value of i
     cout << obj.i;
}

 

출력:

1

3. 클래스의 정적 멤버(Static Members of Class)

객체를 정적으로 분류한다. 변수와 마찬가지로, 정적으로 선언되었을 때 객체도 프로그램의 수명까지 범위가 있다. 객체가 정적이 아닌 경우는 아래의 예시를 통해 확인한다.

 

// CPP program to illustrate
// when not using static keyword
#include <iostream>
using namespace std;

class Guti {
     int i;

public:
     Guti()
     {
          i = 0;
          cout << "Inside Constructor\n";
     }
     ~Guti() { cout << "Inside Destructor\n"; }
};

int main()
{
     int x = 0;
     if (x == 0) {
          Guti obj;
     }
     cout << "End of main\n";
}

 

출력:

Inside Constructor
Inside Destructor
End of main

 

위의 프로그램에서 객체는 if 블록 안에 non-static으로 선언된다. 따라서 변수의 범위는 if 블록 안에만 있다. 따라서 객체가 생성되면 생성자가 호출되고 객체가 선언된 곳에만 if 블록 안에 있기 때문에 if 블록이 제거되면 바로 생성자가 호출되는 것이다. 이제 객체를 정적으로 선언하면 출력이 어떻게 변하는지 살펴 보자.

 

예시:

// CPP program to illustrate
// class objects as static
#include <iostream>
using namespace std;

class Guti {
     int i = 0;

public:
     Guti()
     {
          i = 0;
          cout << "Inside Constructor\n";
     }

     ~Guti() { cout << "Inside Destructor\n"; }
};

int main()
{
     int x = 0;
     if (x == 0) {
          static Guti obj;
     }
     cout << "End of main\n";
}

 

출력:

Inside Constructor
End of main
Inside Destructor

 

출력의 변화를 명확하게 확인할 수 있다. 이제 디스트럭터는 메인 종료 후에 호출된다. 정적 객체의 범위가 프로그램의 수명 전체에 걸쳐 있기 때문에 이런 일이 발생한 것이다.

클래스의 정적 함수는 클래스 내부의 정적 데이터 멤버나 정적 변수와 마찬가지로 클래스의 개체에 의존하지 않는다. 개체와 . 연산자를 사용하여 정적 멤버 함수를 호출하는 것은 허용되지만, 클래스 이름과 스코프 해상도 연산자를 사용하여 정적 멤버를 호출하는 것이 좋다. 정적 멤버 함수는 정적 데이터 멤버나 다른 정적 멤버 함수에만 액세스할 수 있으며, 클래스의 non-static 데이터 멤버나 멤버 함수에는 액세스할 수 없다. 이것의 예시를 살펴본다.

 

예시:

// C++ program to demonstrate static
// member function in a class
#include <iostream>
using namespace std;

class Guti {
public:
     // static member function
     static void printMsg() { cout << "Welcome to Guti!"; }
};

// main function
int main()
{
     // invoking a static member function
     Guti::printMsg();
}

 

출력:

Welcome to Guit!

 

728x90

'C++' 카테고리의 다른 글

C++ 데이터 타입 총정리  (0) 2024.02.21
C++ 리터럴(Literals) 총정리  (0) 2024.02.20
C++ 변수(Variables)의 범위- 지역, 전역 총정리  (0) 2024.02.17
C++ 변수(Variables) 총정리  (1) 2024.02.17
C++ 상수(Constants) 총정리  (1) 2024.02.16