본문 바로가기

Programming/C C++

[C, C++] Class구현시 Static활용

Class를 작성하고 해당 Class에 대해 Object를 생성하면 그 Object는 Class의 복사본이라고 할 수 있습니다. 따라서 하나의 Class에 여러개의 Object를 생성하면 그 생성된 수 만큼의 Class가 복사되는 셈입니다.

이렇게 생성된 각 Object는 해당 Class의 Member를 독립적으로 활용하게 됩니다. 바꿔 말하면 생성된 Object끼리는 Member를 공유할 수 없는 것입니다.

#include <iostream.h>
#include <string.h>

class exam{
  private:
    char name[15];
    int age;
 
  public:
    exam(char *nm, int a);
   
    void memberprint();
};

exam::exam(char *nm, int a)
{
  strcpy(name, nm);
 
  age = a;
}

void exam::memberprint()
{
  cout << "이름 : " << name << endl;
  cout << "나이 : " << age << endl;
}

main()
{
  exam student[2] = {
    exam("soo young", 20),
    exam("young soo", 30)
  };
 
  student[0].memberprint();
  student[1].memberprint();
  return 0;
}


하나의 Class에 대해 Object를 2개(배열로) 생성하였습니다.


각각의 Object는 Class의 Member를 독립적으로 활용하고 있습니다.(값을 별도로 유지하고 있음을 주목해 주십시오.)

그렇다면 생성된 Object끼리 Class의 Member를 통해 값을 공유할 수는 없을까요? 이 문제를 해결할 수 있는 것이 바로 static입니다.

Class의 Member에 static을 선언하면 그 Member는 Class의 Object가 몇개 생성되든지 간에 단 하나의 Memory영역에서만 존재하게 됩니다. 결국 이 영역을 각 Object끼리 접근하게 함으로써 서로다른 Object끼리 공유가 가능하게 되는 것입니다.

#include <iostream.h>
#include <string.h>

class exam{
  private:
    char name[15];
    int age;
    static char chrg[15];
 
  public:
    exam(char *nm, int a);
   
    void memberprint();
   
    static void chrgset(char *nm){
      strcpy(chrg, nm);
    }
   
    static void chrgprnt(){
      cout << "담임 : " << chrg << endl;
    }
};

exam::exam(char *nm, int a)
{
  strcpy(name, nm);
  age = a;
}

void exam::memberprint()
{
  cout << "이름 : " << name << endl;
  cout << "나이 : " << age << endl;
}

char exam::chrg[15];

main()
{
  exam student1("young soo", 16);
  exam student2("soo young", 18);
 
  student1.chrgset("soon dong");
  student1.memberprint();
  student1.chrgprnt();
  student2.memberprint();
  student2.chrgprnt();
 
  student2.chrgset("soon ja");
  student1.memberprint();
  student1.chrgprnt();
  student2.memberprint();
  student2.chrgprnt();
 
  return 0;
}


Class의 chrg, chrgset, chrgprnt member에 static를 붙여 해당 Member를 static Member로 선언하였습니다.

이중 chrg[15]는 char형 배열변수입니다. 이 배열변수 static을 Program에서 사용하기 위해서는 Class외부에서 Class이름을 붙여 다음과 같이 선언해야 합니다.

char exam::chrg[15];

이렇게 해야 하는 이유는 만일 Class를 정의할때 Member에 Static를 붙이고 해당 Class가 존재하는 Program을 위 선언없이 실행한다면 Program안에서 Object를 아무리 생성해도 static이 붙은 해당 Member변수는 단지 Class안에서만 존재할뿐 Memory상에 확보되지 않기 때문입니다.

Object가 생성될때마다 static변수도 Memory에 확보되어야 한다면 각각의 Object 마다 static Member가 Memory에 반복적으로 확보될 것입니다. 이러한 동작은 결국 일반 Member변수나 static Member변수나 별 차이가 없게되고 static만의 의미를 상실하게 됩니다. 앞서 말씀드린 것처럼 static Member는 몇개의 Object가 생성되는지와는 상관없이 단 하나만 존재해야 하기 때문입니다.

예제에서 static char chrg[15]배열 변수는 private하위에 정의되었기 때문에 바로 접근할 수 없습니다. 그래서 다음과 같이 static Member의 값을 설정하고 확인할 수 있는 함수를 public하위에 선언하였습니다.

static void chrgset(char *nm){
      strcpy(chrg, nm);
}
   
static void chrgprnt(){
      cout << "담임 : " << chrg << endl;
}

chrgset() static함수는 static Member인 chrg에 값을 설정하기 위한 함수이며 chrgprnt() static함수는 static Member인 chrg의 값을 확인하기 위한 함수입니다.

static Member변수를 다루기 위해 함수도 static으로 선언하였습니다. static함수는 오로지 static Member변수만 다룰 수 있습니다.

참고:
static함수를 Class에서 정의할때는 위와같이 선언과 동시에 해당 함수를 정의하여야 합니다. Static외에 다른 함수처럼 일단 선언하고

void memberprint();

Class밖에서 정의하는 것은 허용하지 않습니다.

 void exam::memberprint()
{
  cout << "이름 : " << name << endl;
  cout << "나이 : " << age << endl;
}

이러한 경우는 일반 Member함수만 가능합니다.

main함수에서는 먼저 학생의 이름과 나이를 저장합니다.

exam student1("young soo", 16);
exam student2("soo young", 18);

그런다음 student1 Object에서 chrset() static Member함수를 호출하여 static Member변수인 chrg에 soon dong이라는 이름을 설정하였씁니다.

student1.chrgset("soon dong");

이후 student1 객체와 student2 객체의 memberprint()함수와 chrgprnt() static Member함수를 호출하여 현재 설정된 값을 확인합니다.

student1.memberprint();
student1.chrgprnt();
student2.memberprint();
student2.chrgprnt();


위 결과에서 담임 이라고 하는 부분을 주목해 주십시오. 분명 위 Program에서는 student1에서만 chrgset static Member함수를 호출하여 이름을 soon dong이라고 설정하였는데 결과에서는 student1과 student2의 담임 이름이 동시에 soon dong으로 출력되고 있습니다.

이것은 static Member변수가 몇개의 Object가 생성되는지 와는 관계없이 단 하나의 Memory영역에서만 존재하기 때문입니다.

이는 student2에서 chrgset으로 값을 설정할때도 마찬가지 입니다. student2에서 chrgset을 통해 chrg에 값을 설정할때도 student2 object의 chrg가 아닌 공통된 영역에서의 chrg에 값을 설정하는 것이므로 student2뿐만 아니라 student1의 담임값도 같이 바뀌게 됩니다.


주의 :
static으로 선언된 Member함수도 각 객체마다 존재하는 Member가 아닌 static Member변수처럼 하나의 Memory영역에 존재하는 것입니다. 결코 각 Object에 static Member함수가 존재하는 것이 아닙니다.

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

[C, C++] 참조  (0) 2010.04.06
[C, C++] 함수처리  (0) 2010.04.05
[C, C++] Class구현시 Static활용  (0) 2010.04.02
[C, C++] 확장 문자열  (0) 2010.03.30
[C, C++] 표준 Library 함수 - 문자 변환 함수  (0) 2010.03.29
[C, C++] Object간의 연산과 Operator  (0) 2010.02.24

태그