static 변수 필요성 및 활용
이번 포스팅에서는 클래스(객체) 관점에서
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
};
static member function
#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 변수
전역 함수 vs static 함수
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++] return by reference (4) | 2025.02.15 |
---|---|
[C++] class this 키워드 (8) | 2025.02.08 |
[C++] default 생성자 요청 (2) | 2025.02.05 |
[C++] 복사 생성자 (Copy Constructor)란? (3) | 2025.02.04 |
[C++] default member initializer (1) | 2025.02.02 |
댓글