Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

게임 개발 메모장

[ C++ ] static 변수와 함수 본문

언리얼 엔진/C++

[ C++ ] static 변수와 함수

Dev_Moses 2024. 1. 5. 16:14

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() 함수는 일반 함수이기 때문에 모든 변수, 함수에 사용이 가능하다.