반응형
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
};
참고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 |
댓글