게임 개발 메모장
[ C++ ] static 변수와 함수 본문
main 안에서 실수로 값을 초기화 해버리는 문제가 생길 수 있는데,
이를 막을 수 있는 방법이 있을까?
정적 멤버 데이터(static member data)
- static이 붙은 멤버 데이터
- 모든 객체가 공유한다.
- 클래스 내부에 선언을 만들고 클래스 외부에 정의를 만들어야 한다.
- 모든 객체가 공유한다.
- 멤버 이므로 접근 지정자를 사용할 수 있다.
class 내부에 static으로 변수를 선언한다.
private로 선언하면 class 내부에서 getter/setter를 통해 해당 변수에
접근이 가능하게 만들 수 있다.
class 내부에 static으로 선언된 cnt 값을 c1.getCount()로 호출해 가져올 수 있다.
출력 : 3
정적 멤버 데이터와 일반 멤버 데이터
아래 코드에서
- cnt 는 전역변수
- Car::cnt는 정적 멤버 변수
c1, c2, c3는 각자 speed와 color를 별도로 갖고 있지만
Car::cnt는 딱 1개만 생성되어 있다.
객체를 만들지 않아도 Car::cnt는 프로그램 시작할 때 미리 생성이 된다.!
정적 멤버 데이터 생성시 선언부와 정의부 분리해 만드는 경우
static member 변수에 접근하는 방법은 두 가지가 있는데
클래스 이름을 사용해 접근하는 것을 추천한다.
물론 객체 이름을 사용해 접근하는 것도 가능하지만
코드를 나중에 봤을 때 static member 변수가 아닌
일반 변수로 오해할 소지가 있기 때문이다.
static member 데이타 초기화
c++11부터 일반 멤버 데이터는 멤버 필드 초기화를 사용 가능하지만,
정적 멤버 데이터는 필드 초기화를 사용할 수 없다.
: 클래스 외부에 정의에서 초기값을 지정해야 한다.
외부 정의 | 멤버 필드 초기화 | |
non static member data | X | O |
static member data | O | X |
static const 정수계열 | X | O |
static const 비정수계열 | O | X |
static constexpr | X | O |
inline static | X | O |
정적 멤버 함수 (static member function)
- 함수에도 static을 붙여서 객체가 생성되지 않더라도 호출이
가능한 함수를 만들 수 있다.
- 객체 없이 호출이 가능하다.
- 객체 이름으로도 접근이 가능하지만 클래스 이름으로 호출하는 것이 좋다.
- 일반 멤버(데이터, 함수)에 접근할 수 없다.
- 정적 멤버(데이터, 함수)에 접근할 수 있다.
출력 결과
0
3
- 일반 멤버 함수는 각각의 객체에 대한 개별 연산
- 정적 멤버 함수는 모든 객체의 공통에 대한 연산
foo() 함수는 static으로 선언되었기 때문에 일반 변수인 data1,
일반 함수 goo() 사용이 불가하다.
goo() 함수는 일반 함수이기 때문에 모든 변수, 함수에 사용이 가능하다.
'언리얼 엔진 > C++' 카테고리의 다른 글
[ C++ ] 이동 생성자와 이동 시맨틱(Move semantics) (0) | 2024.01.06 |
---|---|
[ C++ ] 복사 생성자(copy constructor) (0) | 2024.01.06 |
[ C++ ] RTTI ( dynamic_cast ) (0) | 2024.01.05 |
[ C++ ] operator 복합 대입 연산자와 이동 대입 연산자 (0) | 2024.01.04 |
[ C++ ] operator 대입연산자 (1) | 2024.01.02 |