C++

static

Nin 2021. 1. 26. 02:31
#include <iostream>

void Func()
{
   int A = 0;
   ++A;
   std::count << A;
}

int main()
{
   Func();
   Func();
   Func();
   Func();
}   

위의 코드를 실행하면 

1

1

1

1

이렇게 출력된다. 함수가 만들어지면 데이터가 생성되고 함수가 끝나면서 파괴되기 때문이다.

이 코드에서 int A를 static으로 만들어주면 A라는 변수가 빌드가 되면

밖으로 나가서 전역변수 처럼 사용된다. 즉, 정보가 파괴되지 않고 남아있는다.

#include <iostream>

void Func()
{
   static int A = 0;
   ++A;
   std::count << A;
}

int main()
{
   Func();
   Func();
   Func();
   Func();
}   

이렇게 static 키워드를 붙여주고 실행하면 1,2,3,4 가 출력된다.

static int A = 0;
void Func()
{  
   ++A;
   std::count << A;
}

빌드가 되면 이런개념으로 사용되기 때문에 A라는 변수의 정보가 계속 남아있게 된다.

그럼 전역변수로 A를 만드는 것과 똑같다고 생각할 수 있는데 전역변수로 A를 만들어주면

다른곳에서 A를 사용할 수 있기 때문에 Func라는 함수에서만 사용할 수 있도록 static으로 

만들어 주는 것이다.

#include <iostream>

void Func()
{
   static int A = 0;
   ++A;
   std::count << A;
}

void Func2()
{
   static int A = 0;
   ++A;
   std::count << A;
}

int main()
{
   Func();
   Func();
   Func();
   Func();
   Func2();
   Func2();
   Func2();
   Func2();
}   

위의 개념으로 보면 위의 코드는 실행이 안되거나

출력결과가 1,2,3,4,5,6,7,8 이라고 생각할 수 있다.

함수를 실행하면 Func()의 static int A가 밖으로 나가고

Func2() 호출되면서 Func2()의 static int A가

밖으로 나가면서 이름이 겹친다고도 생각할 수 있다.

정확하게는 Func::A 와 Func2::A 이런 개념이다.그렇기 때문에 서로 다른 A가 되는것이고

그렇기 때문에 에러도 없고 출력결과는 1,2,3,4,1,2,3,4, 이렇게 나오는 것이다.


클래스 내부의 멤버 변수에서 멤버 함수에서도 static 키워드를 사용할 수 있는데

멤버 변수에 static 키워드를 붙이면 해당 클래스 에서만 이 변수를 전역 변수와 같이

사용하겠다는 것이되고 클래스 외부에서 전역 변수를 선언하듯이 멤버 변수를

static 키워드를 붙여서 선언하고 초기화 하는 코드를 추가해주면 된다.

class Test
{
private:
   static int m_A;
};

int Test::m_A = 0;

int main()
{

}

이렇게 사용하면 Test클래스 객체들 간에 공유 하는 멤버 변수 m_A가 만들어 지는 것이다.

이 값을 클래스 외부에서 사용하고 싶다면 public으로 바꾸면 의미가 사라지기 때문에

멤버 함수로 m_A를 리턴해주는 함수를 만들어 줘야 한다.


멤버 함수에 static 키워드

클래스의 멤버 함수를 호출하려면 당연히 객체를 먼저

선언하고 그 객체의 멤버 함수를 사용해야 한다.

하지만 예외적으로 static 멤버 함수를 선언하면 이 함수는

객체를 선언하지 않고 클래스의 네임스페이스만 가지고 호출이 가능해 진다.

static 멤버 함수가 객체 선언 없이 클래스 네임스페이스만 가지고 호출이 가능한 이유는 

static 멤버 함수를 호출할 때 내부적으로 this 포인터가 넘어가지 않기 때문이다.

(멤버 함수의 특징으로 멤버 함수를 만들게 되면 기본으로 클래스* const this 가 인자값으로

들어가 있고 그렇기 때문에 하나의 클래스로 여러개의 객체를 만들어도 각각의 객체들은

자기만의 함수를 사용하는 것이다.)

즉, static 멤버 함수에서는 this의 사용이 불가능해지고 이 말은

this에 의존하지 않는 static 멤버 변수는 사용이 가능하지만 this를 사용하는 일반 멤버변수에는

접근이 불가능하다.그렇기 때문에 static 멤버 함수에서는 일반 멤버 변수, 멤버 함수는 사용이

불가능하다.