본문 바로가기
C++/기초(두들낙서)

[C++] 정적 멤버 (static)

by Meaning_ 2022. 7. 1.
728x90
반응형

색깔을 저장하는 클래스를 만들어볼 것이다.

 

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include<algorithm>
 
using namespace std;
 
class Color {
public:
    Color() {
        r = 0;
        g = 0;
        b = 0;
 
    }
 
    Color(float r, float g, float b) {
        this->= r;
        this->= g;
        this->= b;
 
    }
 
    float GetR() { return r; }
    float GetG() { return g; }
    float GetB() { return b; }
 
 
private:
    float r;
    float g;
    float b;
};
 
 
Color MixColors(Color a, Color b) {
    Color res=Color(a.GetR() + b.GetR() / 2, a.GetG() + b.GetG() / 2, a.GetB() + b.GetB() / 2); //res객체 생성
 
    return res;
}
 
int main() {
 
    Color blue=Color(001);
    Color red=Color(100);
 
    Color purple = MixColors(blue, red);
 
    cout << purple.GetR() << "," << purple.GetG() << "," << purple.GetB() << endl;
 
}
cs

 

 

이 MixColors 함수를 클래스 안으로 넣어주면 에러메세지가 뜬다.

왜냐면 소속되는 객체를 밝혀주지 않았기 때문이다.

 

그래서 Color purple=purple.MixColors(blue,red); 를 써주는 방법이 있긴 한데 굉장히 어색한 표현이 아닐 수 없다. 

 

정적메서드는 호출할 수 있는 방법은 네임스페이스처럼

 

:: 을 넣어주면 된다!

 

근데 왜 정적메서드를 써야 할까? 

MixColors에서 GetR()같이 get함수를 써야하는데 정적메서드를 쓰면 굳이 그러지 않아도 된다.

 

 

이처럼 전역으로 선언된 것을 class 안으로 집어넣고 싶을 때 사용하는 것이 static이다!

 

클래스 안에서 idCounter는 선언만 가능하다. 여기에 값을 대입하기 위해서는 밖에서 

값을 대입할 수 있고 네임스페이스 처럼 int Color::idCounter=1 이런식으로 쓸 수 있다. 네임스페이스에서 선언과 정리를 분리한 것을 생각해보면 된다.

728x90
반응형

댓글