취미로 음악을 하는 개발자

[C++] Static 멤버 본문

공대인/C[++]

[C++] Static 멤버

영월특별시 2019. 5. 12. 21:57
728x90


우리는 보통 클래스를 만들 때 private 변수와 public 변수를 만든다.

private은 필드값, public은 private 값에 직접적으로 접근하는 것을 방지하기 위한 용도로 사용하곤 한다.


Color MixColors(Color a, Color b)
{
return Color((a.GetR() + b.GetR()) / 2, (a.GetG() + b.GetG()) / 2, (a.GetB() + b.GetB()) / 2);
}


이런식으로 클래스 밖에 함수를 만들고 각 클래스 변수의 필드값을 함수로 호출해서 연산할 수 있다.

정적으로 함수를 바꾸면 좀 더 간단하게 사용할 수 있다. 


static Color MixColors(Color a, Color b) {
return Color((a.r + b.r) / 2, (a.g, b.g) / 2, (a.b + b.b) / 2);
}


위 함수는 Color 클래스 안에 선언된 상태이다.

클래스 밖에서 선언된 함수처럼 get함수를 통해 호출하지만 static 함수는 클래스 내에 선언되었기 때문에

직접적으로 필드에 접근할 수 있게 된다.


static 변수는 선언할 수 있지만 class 안에서 초기화시킬 수는 없다.

변수도 마찬가지로 static으로 선언하면 다른 클래스에서의 변수 이름 중복을 방지할 수 있다.

또한 C++에서는 전역변수 사용을 지양하기 때문에 static으로 선언해서 사용하는 것이 좋다.

//static 변수는 초기화를 할 수 없다.
//static int idCounter = 1; (x)
static int idCounter;


// class 밖에서 초기화시켜준다.
int Color::idCounter = 1;


// 정적 멤버
#include <iostream>

using namespace std;

class Color
{
public:
Color() : r(0), g(0), b(0), id(idCounter++) {}
Color(float r, float g, float b) : r(r), g(g), b(b), id(idCounter++){}

float GetR() { return r; }
float GetG() { return g; }
float GetB() { return b; }

int GetId() {return id; }
static Color MixColors(Color a, Color b) {
return Color((a.r + b.r) / 2, (a.g, b.g) / 2, (a.b + b.b) / 2);
}
//static 변수는 초기화를 할 수 없다.
//static int idCounter = 1; (x)
static int idCounter;

private:
float r;
float g;
float b;

int id;
};

// class 밖에서 초기화시켜준다.
int Color::idCounter = 1;

int main()
{
Color blue(0, 0, 1);
Color red(1, 0, 0);

Color purple = Color::MixColors(blue, red);

cout << "r = " << purple.GetR() << ", g = " << purple.GetG() << ", b = " << purple.GetB() << endl;
cout << "red.GetId() = " << red.GetId() << endl;
cout << "purple.getId() = " << purple.GetId() << endl;
}



'공대인 > C[++]' 카테고리의 다른 글

[C++] 인라인(inline) 함수  (0) 2019.05.12
[C++] 초기화 목록, 생성자 위임  (0) 2019.05.05
[C++] 객체 생성과 소멸  (0) 2019.05.05
[C++] 클래스  (0) 2019.04.23
[C++] Namespace  (0) 2019.04.12
Comments