static 클래스 멤버

Programming/C++ Language 2010. 3. 19. 14:21
클래스의 각 객체는 자신만의 클래스 데이터 멤버의 복사본을 갖는다. static 클래스 변수는 한 변수에 대해 하나의 복사본만 만들어져 클래스의 모든 객체가 공유한다. 즉, static 클래스 변수는 클래스전체 에 사용되는 정보를 나타낸다. 클래스 스코프를 갖는다고 말할수 있다.
스타크래프트를 예로 들었을 때, Terran Unit 이라는 상위 클래스가 있고, 자식 클래스가 Marine, Madic 이 있다고 했을 때, 테란의 전체 유닛의 수를 알기 위해서는 Terran Unit 에 static int nUnitNum; 이 있으면, 테란의 Marine 이나 Madic 이 생성/소멸 때 마다 소멸자에서 nUnitNum 을 증가/감소 시켜주면 테란의 총 유닛의 수를 알수 있다. 또는 Supply 라는 클래스에 int static nSuplNum 을 두고, Supply 가 생성/파괴 될 때 마다, 이 값을 증가/감소 시켜주면, 총 Supply 개수를 알수 있게 된다.
이와 같이, 데이터가 하나의 복사본만으로 충분하다면, static 데이터 멤버를 사용하여 메모리 공간을 절약할 수 있다.

static 멤버는 public, protected, private 로 선언될 수 있으며, 해당 클래스 정의의 몸체가 아닌 파일 스코프에서 반드시 단 한 번만 초기화되어야 한다. 클래스의 private / protected static 멤버는 그 클래스의 public 멤버 함수나 friend 를 통해서 접근되어야 한다. 클래스의 객체가 없을 때에도 접근이 가능한데 이는 클래스이름::변수이름 의 형식으로 접근 가능하다.

-- .h --
class Employee{
public:
static int getCount();
private:
static int count();
}

-- .cpp --
#include .h
int Employee::count = 0; // static 멤버의 정의와 초기화

int Employee::getCount()
{
return count;
}

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

[C++] const  (0) 2010.03.19
[C++] 다양한 생성자 초기화 방법  (0) 2010.03.19
namespace  (0) 2010.03.19
연산자 오버로딩  (0) 2009.09.30
순수 가상 함수  (0) 2009.09.26

설정

트랙백

댓글

모듈화 프로그래밍 - 1

Programming/C Language 2009. 6. 28. 18:34
extern keyword


위와 같이 extern 키워드를 사용하면 새롭게 선언을 하는 것이 아니라 변수 i가 외부에( 다른 파일에 ) 선언 되어 있음을 컴파일러에게 알려주는 것입니다.


static keyword - 전역 변수 선언 시
결론 부터 말하자면, test2.c 파일에서 val1 의 경우에는 접근이 불가능하고 val2는 접근이 가능하다. 전역 변수 앞에 static 선언을 하면 외부에서의( 다른 파일에서의 ) 접근을 금지 한다는 뜻입니다.

PS ) static keyword - 지역 변수 선언시
프로그램이 종료 할 때 까지, 소멸되지도 않고 초기화도 두 번 다시 일어 나지 않는다.
즉, 전역변수와 같은 특징을 가지고 있지만 단, 선언되어 있는 지역내에서만 접근을 허용한다는 것입니다.


링크
각 파일에 대한 object 파일들을 생성하여 주고, 각 object 파일에서 접근하고 있는 변수 및 함수들을 서로 연결 시켜주어 완성된 실행 파일을 생성할 수 있게 해준다. 즉, extern을 했을 때 test2.c 에서는 test1.c에 이 변수 들이 있는지 알지 못하는데 이때 링크 작업을 하여서 test1.c 에 이를 알게 해준다.

 

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

코딩 스타일  (0) 2009.08.15
#ifndef ~ #define ~ #endif  (0) 2009.08.15
헤더파일과 소스파일  (0) 2009.08.02
모듈화 프로그래밍 - 2  (0) 2009.06.28
Coding Standard  (0) 2009.05.01

설정

트랙백

댓글