본문 바로가기

지식창고/프로그래밍

C, C++의 static키워드

반응형

static은 사용되는 대상에 따라 의미가 약간씩 다르다. 각각의 의미와 사용방법, 사용하는 이유 특성 등에 대해 설명하여 보겠습니다.

static은 정적으로 사용하겠다는 뜻을 가지고 있는 키워드입니다. 

 

예를 들어지역변수의 경우 함수가 종료될 시 값이 소멸 되지만, static 키워드를 자료 형 앞에 사용해주게

되면, 값이 소멸되지 않고 계속적으로 사용이 가능하다는 것 입니다. 

 

, 지역변수를 전역변수의 성격을 지닐 수 있게 해준다는 것 입니다.

 

 

(1).일반적인 C언어 자료형의 지역변수.

int test();

 

 

int main(void)

{

                  for(int i = 0; i < 10; i++)

                  {

                                   cout << "main 함수 i  : " << i << ", test함수의 : " << test() << endl;

                  }

 

 

}

 

 

int test()

{

                  int t_num = 1;

 

 

                  t_num += 1;

 

 

                  return t_num;

}

와 같이 사용하게 되었을 시,

 

와 같이 되지만,

 

 

test 함수의 int t_num부분을 static 키워드를 사용하여

int test();

 

 

int main(void)

{

                  for(int i = 0; i < 10; i++)

                  {

                                   cout << "main 함수 i  : " << i << ", test함수의 : " << test() << endl;

                  }

}

 

 

int test()

{

                  static int t_num = 1;

 

 

                  t_num += 1;

 

 

                  return t_num;

}

와 같이 변경해주게 되면, 결과는 아래와 같이 됩니다.

 

 

 

 

 

(2).맴버변수

맴버변수의 자료형 앞에 static 이라는 키워드를 적어주게 되면 그것이 바로 static 맴버 변수라 합니다.

static 멤버변수로 선언하면 변수 값을 공유할 뿐만 아니라 메모리 절약효과가 있으며,

static 멤버변수로 선언하게 되면 static멤버변수는 각 오브젝트에서 송유하게 되는 변수가 됩니다.

static 멤버변수에는 클래스 선언 부 밖에서 반드시 초기값을 주어야 합니다

주의 할 점은 바로 클래스 내에서는 초기값을 줄 수 없다는 것 입니다.

static 멤버변수는 오브젝트 이름 없이 클래스 자료 형을 이용하여 사용이 가능합니다.

 

#include <iostream>

 

 

using namespace std;

 

 

class TEST

{

public:

                  static int a;

};

 

 

int TEST::a;

 

 

int main(void)

{

                  TEST test;

                  test.a = 20;                                 //객체를 통한접근.

 

 

                  cout << test.a << endl;

TEST::a = 30;                           //객체를 통하지 않은 접근.

                  cout << TEST::a << endl;

                  return 0;

}

 

 

와 같이 해주어야 하며, static변수 선언 static변수는 클래스 밖에서 선언해야 합니다.

번외적인 예를 들어본 소스.

#include <iostream>

 

 

using namespace std;

 

 

class TEST

{

public:

                  static int a;

};

 

 

int TEST::a;

TEST test;

 

 

void test2();

 

 

int main(void)

{

                  test.a = 20;

 

 

                  cout << test.a << endl;

                  test2();

return 0;

}

 

 

void test2()

{

                  cout << test.a << endl;

                  test.a += 1;

                  cout << "1 증가시켜보자\n" << test.a << endl;

}

 

 

와 같이도 사용 해 줄 수 있다는 것 입니다.

 

 

(3). 맴버 함수

: static 멤버함수는 멤버함수 머리부 결과 형 앞에 static이라는 키워드를 기재해 놓는 함수를 말하며 이 멤버함수의 특징은 오브젝트 이름 없이 호출가능 한 멤버함수입니다.

static 멤버함수는 일반 멤버함수가 가지고 있는 숨어있는 매개변수인 this pointer 변수를

가지고 있지 않는 멤버함수이므로 멤버변수를 직접적으로 이용할 수  없다.

static 멤버함수 안에서 일반 멤버변수를 이용하려면 매개변수로 클래스 형 오브젝트나 오브젝트 주소변수를 가지고 있어야 한다. (,static 멤버변수는 오브젝트 이름 없이 사용가능)

>static 멤버함수의 호출방법

클래스이름::static멤버함수()//오브젝트이름 없이 호출하기

오브젝트이름.static멤버함수() //오브젝트 이름 이용하여 호출하기

 

#include <iostream>

 

 

using namespace std;

 

 

class TEST

{

public:

                  static int a;

 

 

                  static void Set_a(int num)

                  {

                                   a = num;

                  }

 

 

                  static void Show()

                  {

                                   cout << a << endl;

                  }

};

 

 

int TEST::a = 0;

 

 

int main(void)

{

                  int num = 0;

                 

                  TEST::Show();

                  cout << endl;

                  cout << "오브젝트 이름 없이 호출하기\n";

                  for(int i = 0; i < 10; i++)

                  {

                                   TEST::Set_a(num);

                                   TEST::Show();

                                   num++;

                  }

                  cout << endl;

                  TEST test;

                  num = 20;

                  cout << "오브젝트 이름을 이용하여 호출하기\n";

                  for(int i = 20; i < 30; i++)

                  {

                                   test.Set_a(num);

                                   num++;

                                   test.Show();

                  }

                  return 0;

}

 같이 코딩을 하게 되면 아래와 같이 출력되는 것을 확인할 수 있습니다.

 

 

 

(6). C++의 클래스 객체

Static 자체가 생성될 때 메모리를 계속적으로 확보를 하고 있는 것이기 때문에 애매한 설명일 수 도 있겠지만, 위의 코딩와 별반 다를 바 없이 한번 가지고 있는 값은 소멸되지 않고 계속적으로 가지고 있다는 점이라고 할 수 있을 것 입니다. 

 

아래 소스는 객체에 static 키워드만 사용하여 구동한 소스입니다.

 

#include <iostream>

 

 

using namespace std;

 

 

class TEST

{

public:

                  static int a;

 

 

                  static void Set_a(int num)

                  {

                                   a = num;

                  }

 

 

                  static void Show()

                  {

                                   cout << a++ << endl;

                  }

};

 

 

int TEST::a = 0;

 

 

static TEST test;

 

 

int main(void)

{

 

 

                  int num = 0;

                 

                  TEST::Show();

                  cout << endl;

                  cout << "오브젝트 이름 없이 호출하기\n";

                  for(int i = 0; i < 10; i++)

                  {

                                   TEST::Set_a(num);

                                   TEST::Show();

                                   num++;

                  }

                  cout << endl;

 

 

                  test.a = 5;

 

 

                  cout << "오브젝트 이름을 이용하여 호출하기\n";

                  for(int i = 1; i < 10; i++)

                  {

                                   test.Show();

                  }

 

 

                  return 0;

}

 

반응형

'지식창고 > 프로그래밍' 카테고리의 다른 글

(C++)c++의 함수오버로딩이란?  (0) 2019.07.03
(C, C++)c, c++에서 참조자란?  (0) 2019.07.03
(C)namespace키워드의 사용방법과 의미  (0) 2019.07.03
(C++)inline함수란 무엇인가  (0) 2019.07.03
Const 키워드  (0) 2019.06.30