본문 바로가기
프로그래밍 언어/C++

[C++] static 변수 필요성 및 활용

by 까망 하르방 2025. 2. 6.
반응형

static 변수 필요성 및 활용

이번 포스팅에서는 클래스(객체) 관점에서

static 키워드 필요성과 특징에 대해 알아보고자 한다.

 

 

아래 포스팅에 대한 추가 예시이기도 하다.

📌 [C/C++] static 변수

 

[C/C++] static 변수

static 변수- static 변수를 정적 변수라고 부릅니다.- 전역변수와 지역변수 모두에 static 선언을 추가할 수 있다.  하지만 static 변수는 『접근이 제한된 전역변수』를 만드는 것으로  지역변수 적

zoosso.tistory.com


static 변수 필요성

#include <iostream>

int count = 0;

class Car
{
	int speed;

public:
	Car() { ++count; }
	~Car() { --count; }
};

int main()
{
	Car c1;
	Car c2;

	printf("%d\n", count);

	// 전역 변수라서 제한없이 접근 가능
	count = 50;
}

 

 

전역 변수로 자동차 개수(count)로 두어서

Car 객체가 생성/소멸될 때 count 변수를 관리할 수 있다.

하지만 Car 객체가 아니더라도 누구나 접근 가능

→ 모든 객체가 공유 → 접근 지정자 등으로 보호 필요

 

한편으로

「count」 라는 변수명을 다른 곳에서 재사용하기 어렵다.


static 변수 활용

#include <iostream>

class Car
{
	int speed;
public:
	static int count;
	Car() { ++count; }
	~Car() { --count; }
};

int Car::count = 0;

class Truck
{
	int speed;
public:
	static int count;
	Truck() { ++count; }
	~Truck() { --count; }
};
int Truck::count = 0;

int main()
{
	Car c1;
	Car c2;
	printf("%d\n", Car::count); // 2

	Truck t;
	printf("%d\n", Truck::count); // 1
}

 

 

• 멤버 데이터 앞에 static 키워드 적용

• 반드시 클래스 외부에서 선언(정의) 되어야 한다.

• 객체 생성시 static member data는 객체 메모리에 포함되지 않는다.

객체가 만들어지기 전에 별도 공간에 단 한 개로 만들어져 객체간 공유

클래스 이름과 스코프(::) 연산자로 접근

• 클래스 선언/구현 파일 구분하는 경우 멤버 변수 외부 선언은 구현 파일에 있어야 한다.

 (static const, static constexpr, inline variable 은 외부 선언 없이 클래스 내부에서 초기화 가능)

struct Object
{
	//	static int data1 = 0; // error (외부에서 선언 필요)

	static const int data2 = 0;     // ok
	static constexpr int data3 = 0; // ok
};
 
 
 
참고1
c1.count」 와 같이 객체 이름으로도 접근 가능하지만
static 멤버인지 구분이 잘 되지 않기 대문에
클래스 이름 「Car::count」 형태로 접근 권장
 
 
참고2
객체 당 1개씩 생성되는 변수
 instance filed
• 클래스당 1개 (동일 타입의 모든 객체 공유
 → class field 혹은 static field 라고 한다.
 
 
전역 변수처럼 사용하는데
접근 지정자 설정 가능하며
namespace 소속을 분명히 할 수 있다. → 각 클래스가 동일한 변수명을 가질 수 있다.

static member function

멤버 데이터와 같이 멤버 함수 앞에도 static 키워드 활용 가능
객체 없이 호출 가능한 멤버 함수
객체 이름 or 클래스 이름으로 접근 가능 (클래스 이름으로 접근 권장)
#include <iostream>

class Car
{
	int speed = 0;
	static int count;
public:
	Car() { ++count; }
	~Car() { --count; }

	static int getCount() { return count; }
};
int Car::count = 0;

int main()
{
	// 객체 생성전에 Car 객체의 개수를 알고 싶다.
	// static member function으로 객체 생성 없이 바로 접근 가능
	std::cout << Car::getCount() << std::endl;

	Car c;
	
	// 객체 이름보다 클래스 이름으로 접근 권장
	std::cout << c.getCount() << std::endl; 
	std::cout << Car::getCount() << std::endl;

	// private 접근 지정으로 직접 접근 불가
	// std::cout << Car::count << std::endl;
}
 
 
 

전역 변수 vs static 변수

둘 다 메모리 할당은 프로그램 처음 실행 시 올라가지만
전역 변수는 접근 지정자 사용 X
static 멤버 데이터는 접근 지정자 활용 가능
 
 

전역 함수 vs static 함수

둘 다 객체 없이 호출 가능하지만
전역 함수는 private 변수에 접근 불가하지만
static 멤버 함수는 private 변수에 접근 가능
 
반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

[C++] default 생성자 요청  (2) 2025.02.05
[C++] 복사 생성자 (Copy Constructor)란?  (3) 2025.02.04
[C++] default member initializer  (1) 2025.02.02
[C++] 클래스 파일 분할  (4) 2025.01.30
[C++] constexpr function  (1) 2025.01.29

댓글