'정적 멤버'에 해당되는 글 2건

  1. 2021.01.12 static
  2. 2020.12.15 캡슐화 기법

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
,

캡슐화 기법

C++ 2020. 12. 15. 23:22

프렌드

- 기본적으로 멤버 변수에 접근하기 위해서 public 멤버 함수를 이용해야 함

- 특정한 객체의 멤버 함수가 아닌 경우에도 private 멤버에 접근해야 할 때가 있음

- 이때 프렌드 키워드를 이용하면 특정한 객체의 모든 멤버에 접근할 수 있음

 

캡슐화

- 캡슐화란 객체 지향 프로그래밍 기법에서 중요한 키워드

- 캡슐화의 기본 원리는 관련된 함수 및 멤버들은 되도록 하나의 클래스에서 관리하는 것

- 같이 실행되어야 하는 기능들도 하나의 클래스에 넣어서 각 객체가 응집된 기능을 가질 수 있도록 해야 함

 

프렌드 함수

- 기존의 함수 앞에 friend 키워드를 붙인 형태로 사용할 수 있음

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

class Student {
private:
    int studentId;
    string name;
public:
    Student(int studentId, string name) : studentId(studentId), name(name) {}
    friend Student operator + (const Student &student, const Student &other) {
        return Student(student.studentId, student.name + " & " + other.name); // friend 키워드를 이용해 이름에 접근
    }
    void showName() { cout << "이름: " << name << '\n'; }
};

int main(void) {
    Student student(1, "khon");
    Student result = student + student;
    result.showName();
    system("pause");
    return 0;
}

 

프렌드 클래스

- 프렌드 멤버 함수 이외에도 프렌드 클래스 형태로 사용할 수 있음

- 두 클래스가 서로 밀접한 연관성이 있으며 상대방의 private 멤버에 접근해야 한다면 클래스 자체를 프렌드로 선언할 수 있음

- 프렌드 클래스에서는 모든 멤버 함수가 특정 클래스의 프렌드임

 

* 프렌드 클래스: 시간 클래스 정의하기

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <stdio.h>
#include <ctime>

using namespace std;

class Time {
    friend class Date; // Date 클래스에서 Time 클래스를 이용할 수 있음
private:
    int hour, min, sec;
public:
    void setCurrentTime() {
        time_t currentTime = time(NULL);
        struct tm *p = localtime(&currentTime);
        hour = p->tm_hour;
        min = p->tm_min;
        sec = p->tm_sec;
    }
};

class Date {
private:
    int year, month, day;
public:
    Date(int year, int month, int day) : year(year), month(month), day(day) {}
    void show(const Time &t) {
        cout << "지정된 날짜: " << year << "년 " << month << "월 " << day << "일 " << '\n';
        cout << "현재 시간: " << t.hour << ":" << t.min << ":" << t.sec << ":" << '\n';
    }
};

int main(void) {
    Time time;
    time.setCurrentTime();
    Date date = Date(2020, 12, 15);
    date.show(time);
    system("pause");
    return 0;
}

 

정적 멤버

- 클래스에는 포함되어 있는 멤버이지만 모든 객체가 공유하는 멤버

- 정적으로 선언된 멤버는 메모리 상에 오직 하나만 할당되어 관리됨

- 정적 멤버를 public으로 선언하면 외부의 어떠한 클래스에서 접근이 가능하며 오직 하나만 관리됨

- 정적 멤버는 일반적으로 싱글톤 패턴 등의 다양한 기능을 위해 사용됨

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

class Person {
private:
    string name;
public:
    static int count;
    Person(string name) : name(name) {
        count++;
    }
};

int Person::count = 0; // 정적 변수 초기화

int main(void) {
    Person p1("khon");
    Person p2("khon02");
    Person p3("khon01");
    cout << "사람의 수: " << Person::count << '\n';
    system("pause");
    return 0;
}

 

상수 멤버

- 호출된 객체의 데이터를 변경할 수 없는 멤버를 의미

- 일반적으로 클래스에서 사용되는 중요한 상수는 상수 멤버 변수로 정의해서 사용하는 관행이 있음

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

class Person {
private:
    const int id;
    string name;
public:
    static int count;
    Person(int id, string name) : id(id), name(name) {
        count++;
    }
    /*
     void setId(int id) {
        this->id = id; // 오류 발생 수정 불가능
     */
};

int Person::count = 0;

int main(void) {
    Person p1(1, "khon");
    Person p2(2, "khon02");
    Person p3(3, "khon01");
    cout << "사람의 수: " << Person::count << '\n';
    system("pause");
    return 0;
}

 

 

- C++에서 캡슐화를 위해 사용되는 프렌드, 정적 멤버 등의 개념을 바르게 숙지해야 객체 지향 프로그래밍 기법을 보다 자유롭게 활용할 수 있음

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

템플릿  (0) 2020.12.16
다형성 기법  (0) 2020.12.16
오버로딩  (0) 2020.12.15
클래스 상속  (0) 2020.12.15
생성자와 소멸자  (0) 2020.12.15
Posted by khon98
,