티스토리 뷰
- non-static 멤버 (static이 아닌 멤버)는 객체가 생성될 때 생성되고, 각 객체마다 별도로 생성된다. 즉, 객체가 죽으면 (소멸되면) 이 멤버도 죽는다.
- 인스턴스(instance) 멤버라고도 부름.
- 공유되지 않음.
- 하지만 static 멤버는 객체의 멤버이지만, 객체가 생기기 전에 이미 생성되어 있고 객체가 죽어도 죽지 않는다.
- 클래스(class) 멤버라고도 부름.
- 동일 클래스(class)의 모든 객체들에 의해 공유됨.
// static 멤버는 이렇게 선언한다. 즉, static이 붙지 않으면 전부 non-static 임.
class Person
{
public:
// 생략
static int sharedMoney;
static void addShared (int n) { sharedMoney += n; }
// 생략
};
// 사용하려면 외부에 전역(global) 변수로 선언해야한다.
int Person::sharedMoney = 10;
// 사용법 ① .과 -> 사용하기
int main()
{
Person lee;
lee.sharedMoney = 500; // dot 연산자 (. 사용)
Person *p;
p = &lee;
p->addShared(200); // arrow 연산자 (-> 사용)
}
//사용법 ② 클래스명:: 사용하기
int main()
{
Person::sharedMoney = 200; // 클래스 명 (Person)과
Person::addShared(200); // scope 연산자 (::)
}
- static으로 캡슐화하기
- C++은 C와의 호환성 때문에 100% 캡슐화 하지 못한다.
- 그렇기 때문에 사용자가 직접 캡슐화를 해준다. (전역 변수, 전역 함수 사용X)
- static 멤버로 선언하면 캡슐화가 된다.
class Math
{
public:
static int abs(int a) { return a>0?a:-a; }
// a>0가 true이면 a라고 반환, false이면 -a라고 반환.
static int max(int a, int b) { return (a>b)?a:b; }
// a>b가 true이면 a를 반환, false이면 b를 반환.
static int min(int a, int b) { return (a>b)?b:a; }
// a>b가 true이면 b를 반환, false이면 a를 반환.
};
int main()
{
std::cout << Math::abs(-5) << std::endl; //5
std::cout << Math::max(10, 8) << std::endl; // 10
std::cout << Math::min(-3, -8) << std::endl; // -8
}
- static 멤버 함수는 오직 static 멤버들만 접근이 가능하다.
- 즉 non-static인 멤버가 접근하면 오류가 뜬다.
- static 멤버 함수에서는 this pointer를 사용할 수 없다.
// 앞에 왕창 생략
static void addShared(int n) {
this->sharedMoney += n; // 오류
}
'C /C++' 카테고리의 다른 글
[C][Stack] 백트래킹을 이용한 길찾기/미로찾기 (0) | 2019.12.05 |
---|---|
[C] fgets() (0) | 2019.06.24 |
[C][과제] 숫자야구 ++ (0) | 2018.10.28 |
[C/C++][과제] 숫자야구 (0) | 2018.10.13 |
[C/C++][과제?] 오목 중간 백업 (0) | 2018.08.29 |
댓글