static

C++ 2021. 1. 12. 16:06

출처 : 도서 - 그림으로 배우는 C++ Programming Basic

 

 

정적 멤버의 원리

- 클래스는 객체에 연결되지 않은 멤버를 가질 수도 있음 이를 '클래스 전체에 연결되었다'라고 부름

- 클래스에 연결된 멤버는 정적 멤버(Static Member)라고 부름

- 정적 멤버가 되는 데이터 멤버 및 멤버 함수를 선언할 때는 static이라고 하는 기억 클래스 지정자를 붙여야 함

 

#include <iostream>

using namespace std;

// Car 클래스 선언
class Car {
private:
    int num;
    double gas;
public:
    static int sum; // 정적 데이터 멤버
    Car();
    void setCar(int n, double g);
    void show();
    static void showSum(); // 정적 멤버 함수
};

// Car 클래스 멤버 함수의 정의
Car::Car() {
    num = 0;
    gas = 0.0;
    sum++;
    cout << "자동차가 만들어졌습니다. \n"; // 생성자가 호출될 때 정적 데이터 멤버 sum의 값을 1증가 시킴
}

void Car::setCar(int n, double g) {
    num = n;
    gas = g;
    cout << "차량 번호를 " << num << "으로, 연료량을 " << gas << "으로 바꾸었습니다. \n";
}

void Car::showSum() { // 정적 멤버 함수 정의
    cout << "자동차는 모두 " << sum << "대 있습니다. \n";
}

void Car::show() {
    cout << "차량 번호는 " << num << "입니다." << endl;
    cout << "연료량은 " << gas << "입니다" << endl;
}

int Car::sum = 0; // 정적 데이터 멤버 초기화

// Car 클래스의 이용
int main(int argc, const char * argv[]) {
    Car::showSum(); // 정적 데이터 함수 호출
    
    Car car1; // 객체 생성
    car1.setCar(7777, 95.7);
    
    Car::showSum(); // 정적 데이터 함수를 한번 더 호출
    
    Car car2;
    car2.setCar(9999, 72.4);
    
    Car::showSum();
    
    return 0;
}

자동차는 모두 0대 있습니다. // 정적 멤버 함수는 0대라고 출력

자동차가 만들어졌습니다. // 객체가 생성

차량 번호를 7777으로, 연료량을 95.7으로 바꾸었습니다. 

자동차는 모두 1대 있습니다. // 정적 멤버 함수는 1대라고 출력

자동차가 만들어졌습니다. 

차량 번호를 9999으로, 연료량을 72.4으로 바꾸었습니다. 

자동차는 모두 2대 있습니다. 

Program ended with exit code: 0

--------------------------------------

 

static int sum; // static을 붙여 정적 멤버로 만듦

 

sum은 클래스와 연결되어 있기 때문에 각 객체의 생성자 안에서 초기화시킬 수 없음

함수 바깥에서 Car::를 붙여 초기화시킴

자동차 객체가 하나 생성될 때마다 생성자 안에서는 sum++라는 문장이 실행, 그 결과 값이 1씩 증가

결과적으로 변수 sum은 Car 클래스를 통해 몇 대의 자동차가 만들어졌는지(객체의 개수가 몇 개인지)를 저장하는 필드가 된 것

 

정적 데이터 멤버란, 같은 클래스의 모든 객체들이 공통적으로 접근해야 하는 데이터를 저장하는 데이터 멤버

 

static void showSum(); // 정적 멤버 함수

 

멤버 함수에 static을 붙이면 객체를 생성하지 않더라도 호출할 수 있음

정적 멤버 함수는 객체를 생성하지 않은 상태에서도 호출할 수 있어야 하기 때문에 일반적인 함수와 호출 방법이 다름

 

정적 멤버 함수의 호출

클래스명 :: 함수명(인수 목록);

Car :: showSum(); // 클래스 이름을 붙여서 함수를 호출

 

정적 멤버 함수 안에서는 일반 멤버에 접근할 수 없음

정적 멤버 함수 또한 특정한 객체에 연결된 것이 아니기 때문

'C++' 카테고리의 다른 글

포인터 연산자 예제  (0) 2021.01.21
예제1  (0) 2021.01.21
is a / has a  (0) 2021.01.11
C++ 문제 풀이  (0) 2021.01.11
소켓 프로그래밍 함수와 Winsock2  (0) 2020.12.17
Posted by khon98
,