728x90
static 멤버와 non-static 멤버의 특성
[ static ]
: 변수와 함수에 대한 기억 부류의 한 종류
- 생명 주기 : 프로그램이 시작될 때 생성, 프로그램 종료 시 소멸
- 사용 범위 : 선언된 범위, 접근 지정에 따름
[ 클래스의 멤버 ]
- static 멤버
- 프로그램이 시작할 때 생성
- 클래스 당 하나만 생성, 클래스 멤버라고 불림
- 클래스의 모든 인스턴스들이 공유하는 멤버
- non-static 멤버
- 객체가 생성될 때 함께 생성
- 객체마다 객체 내에 생성
- 인스턴스 멤버라고 불림
[ static 멤버 선언 ]
- 예제로 이해하기
class Person {
public:
// non-statice 멤버 선언
double money; // 개인 소유의 돈
void addMoney(int money) {
this -> money += money;
}
// static 멤버 변수 선언
static int sharedMoney; // 공금
// static 멤버 함수 선언
static void addShared(int n) {
sharedMoney += n;
}
};
// static 변수 공간 할당. 프로그램의 전역 공간에 선언
// 클래스의 위치를 벗어난 외부자리에 초기화 함
int Person::sharedMoney = 10; // sharedMoney를 10으로 초기화
- static 멤버 변수
- static 멤버 변수 생성 시, 전역 변수로 생성하고 전체 프로그램 내에 한 번만 생성 됨.
- static 멤버 변수에 대한 외부 선언이 없으면 링크 오류 발생
[ static 멤버 사용 ]
1) 객체의 멤버로 접근 : static 멤버는 객체 이름이나 객체 포인터로 접근
- 보통 멤버처럼 접근할 수 있음
객체.static멤버
객체포인터 -> static멤버
- Person 타입의 객체 lee와 포인터 p를 이용하여 static 멤버를 접근하는 예
Person lee;
less.sharedMoney = 500; // 객체.static 멤버 방식
Person *p;
p = &lee;
p -> addShared(200); // 객체 포인터 -> static 멤버 방식
- 객체의 멤버로 접근 사용 예시
#include <iostream>
using namespace std;
class Person {
public:
// non-static 멤버 선언
double money;
void addMoney(int money) {
this -> money += money;
}
// static 멤버 변수
static int shared Money;
// static 멤버 함수
static void addShared(int n) {
sharedMoney += n;
}
};
// static 변수 생성. 전역공간에 생성
int Person::sharedMoney = 10; // 10으로 초기화
// main() 함수
int main() {
Person han;
han.money = 100; // han의 개인 돈 = 100
han.sharedMoney = 200; // static 멤버 접근, 공금=200
Person lee;
lee.money = 150;
lee.addMoney(200);
lee.addShared(200);
cout << han.money << ' ' << lee.money << endl;
cout << han.sharedMoney << ' ' << lee.sharedMoney << endl;
}
2) 클래스명과 범위 지정 연산자(::)로 접근 : 클래스 이름과 범위 지정 연산자(::)로 접근
- static 멤버는 클래스마다 오직 한 개만 생성되기 때문
// 클래스명::static 멤버
Person::sharedMoney = 200;
Person::addShared(200);
- non-static 멤버는 클래스 이름을 접근 불가
Person::money = 100; // 컴파일 오류
Person::addMoney(200); // non-static 멤버는 클래스 명으로 접근 불가
3) static 멤버와 non-static 멤버 비교
Static 활용
[ static의 주요 활용 ]
- 전역 변수나 전역 함수를 클래스에 캡슐화
- 전역 변수나 전역 함수를 가능한 사용하지 않도록
- 전역 변수, 전역 함수를 static으로 선언하여 클래스 멤버로 선언
- 객체 사이에 공유 변수를 만들고자 할 때
- static 멤버를 선언하여 모든 객체들이 공유
1) static 멤버 함수는 static 멤버만 접근 가능
- static 멤버 함수가 접근할 수 있는 것 : static 멤버 함수, static 멤버 변수, 함수 내의 지역 변수
- static 멤버 함수는 non-static 멤버에 접근 불가 ▶ 객체가 생성되지 않은 시점에서 static 멤버 함수가 호출될 수 있기 때문
2) non-static 멤버 함수는 static에 접근 가능
- non-static 함수는 non-static이나 static 멤버에 모두 접근 가능
3) static 멤버 함수는 this 사용 불가
- static 멤버 함수는 객체가 생기기 전부터 호출 가능 ▶ static 멤버 함수에서 this 사용 불가
728x90
'Programming > C++' 카테고리의 다른 글
[C++ 스터디] 템플릿과 표준 템플릿 라이브러리{STL}_(2) (0) | 2022.12.08 |
---|---|
[C++ 스터디] 템플릿과 표준 템플릿 라이브러리{STL}_(1) (0) | 2022.12.04 |
[C++ 스터디] 상속(1) (1) | 2022.11.27 |
[C++ 스터디] 참조리턴 / 복사 생성자 / 함수 중복 (0) | 2022.11.13 |
[C++ 스터디] 객체 치환 및 객체 리턴 | Vector (0) | 2022.11.06 |