Automotive Software

정적 멤버 변수 및 함수 (Static Member and Function) 본문

프로그래밍 (Programming)/C++ (C Plus Plus) 기초

정적 멤버 변수 및 함수 (Static Member and Function)

AutoSW 2021. 1. 11. 23:44
  • 일반적인 멤버 변수는 비정적인(Non-static) 변수로 선언되어 클래스의 객체 생성 시 메모리를 할당받아 생성됨
    • 객체가 생성되지 않으면 메모리내에 상주하지 않아 비정적인 멤버 변수는 접근 불가
      • 접근 범위가 객체내부에 한정되므로 외부에서 선언이 불필요함
    • 인스턴스(객체) 멤버 : 객체별 독립된 메모리 할당
  • 정적(Static) 멤버 변수는 전역 변수와 같이 프로그램 실행 시 메모리를 할당받아 생성됨
    • 객체가 생성되지 않더라도 이미 메모리에 상주하므로 정적인 멤버 변수는 접근 가능
      • 일반적인 전역 변수와 같이 클래스 외부에서 직접적인 선언이 있어야 함
    • 클래스 멤버 : 동일 클래스의 모든 객체(인스턴스)에서 공유
  • 접근
    • 클래스 객채를 통한
      • 멤버 접근 방식은 일반적인 멤버 접근과 동일
    • 클래스 객체를 통하지 않은
      • 멤버 변수 및 함수 접근 방식은 클래스명과 범위지정 연산자를 명시적으로 사용하여 가능
    • 정적 멤버 함수 -----> 비정적 멤버 변수(함수)로의 접근 : 불허용
    • 정적 멤버 함수 -----> this 포인터 접근 : 불허용
      • 객체의 메모리 할당 여부 불투명
      • this 포인터를 가지지 않으므로 const로 선언될 수 없음
    • 비정적 멤버 함수 --> 정적 멤버 변수(함수)로의 접근 : 허용 (정적 변수는 이미 메모리 할당)
  • 주요 적용 예
    • 동일한 클래스를 가지는 객체 간 특정 공유 변수를 가지고자 할 때
    • 전역 변수 또는 함수를 특정 클래스에 캡슐화하고자 할 때
    • 생성 객체의 개수를 나타내고자 할 때 (생성자 증가, 소멸자 감소)
class cMyClass
{
public:
	cMyClass(){ numOfInstances++; }
	~cMyClass(){ numOfInstances--; }
	static int numOfInstances;	// 정적 멤버변수 선언
};

int cMyClass::numOfInstances = 0; // 정적 멤버변수 정의

int main()
{
	...
 	int howMany = cMyClass::numOfInstances; // 객체를 통하지 않은 정적 멤버변수 접근


	return 0;
}

 

  • 전용 정적 멤버 변수 및 접근 함수
    • 범용 정적 멤버 변수는 전용(private) 또는 보호(protected)로 선언 후 접근 함수를 구현함으로써 접근을 제한 할 수 있음
class cMyClass
{
public:
	cMyClass(){ numOfInstances++; }
	~cMyClass(){ numOfInstances--; }
	int getInstance(){ return numOfInstances; }
private:    
	static int numOfInstances;	// 정적 멤버변수 선언
};

int cMyClass::numOfInstances = 0; // 정적 멤버변수 정의

int main()
{
	...
	cMyClass myClass;
 	int howMany = myClass.getInstance(); // 객체를 통한 정적 멤버변수 접근


	return 0;
}

'프로그래밍 (Programming) > C++ (C Plus Plus) 기초' 카테고리의 다른 글

함수 포인터 (Function Pointer)  (0) 2021.01.13
다형성 (Polymorphism)  (0) 2021.01.07
상속 (Inheritance)  (0) 2021.01.02
연산자 중첩  (0) 2020.12.29
객체 초기화  (0) 2020.12.29