[5장] 클래스와 객체: C++의 객체지향 프로그래밍 소개

C++에서 클래스와 객체의 세계로 여러분을 초대합니다! 이 챕터에서는 객체지향 프로그래밍의 기초를 배우며, 클래스의 정의와 객체 생성의 기본을 탐구합니다. 실용적인 예제로 C++의 핵심을 익혀봅시다!

클릭하시면 확대된 이미지를 확인하실 수 있습니다.

전문가를 위한 C++ : C++20 병렬 알고리즘 파일시스템 제네릭 람다 디자인 패턴 객체지향의 원리를 익히는 확실한 방법 개정판, 한빛미디어

#include <iostream>
using namespace std;

// 클래스 정의
class Car {
    private:
        string color; // private 변수, 클래스 외부에서 직접 접근 불가
        int speed;    // private 변수

    public:
        // 생성자
        Car(string c, int s) {
            color = c;
            speed = s;
        }

        // 색상 값을 반환하는 public 메소드
        string getColor() {
            return color;
        }

        // 속도 값을 반환하는 public 메소드
        int getSpeed() {
            return speed;
        }

        // 속도를 설정하는 public 메소드
        void setSpeed(int s) {
            speed = s;
        }
};

int main() {
    // 객체 생성
    Car myCar("Red", 0); // "Red" 색상과 초기 속도 0으로 myCar 객체 생성

    // 객체의 메소드 사용
    cout << "My car's color is " << myCar.getColor() << endl;
    cout << "My car's speed is " << myCar.getSpeed() << " km/h" << endl;

    // 객체의 속도 변경
    myCar.setSpeed(60); // myCar의 속도를 60km/h로 설정
    cout << "My car's new speed is " << myCar.getSpeed() << " km/h" << endl;

    return 0;
}

주요 부위 설명(클래스와 객체)

초보자를 위한 C++ 200제:C++시작을위한최고의입문서! 설치부터문법배우고JSON응용까지레벨업!, 정보문화사

  1. 클래스 정의 (class Car):
    • Car라는 이름의 클래스를 정의합니다. 이 클래스는 자동차 객체를 표현합니다.
    • 클래스 안에는 데이터(색상, 속도)를 저장하는 변수(color, speed)와 이 데이터를 처리하는 함수(메소드)들이 포함됩니다.
  2. 접근 제어자 (private, public):
    • private 접근 제어자: 클래스 내부에서만 접근 가능한 변수를 정의합니다.
    • public 접근 제어자: 클래스 외부에서도 접근 가능한 메소드를 정의합니다.
  3. 생성자 (Car(string c, int s)):
    • Car 클래스의 객체가 생성될 때 호출됩니다.
    • 초기 색상과 속도를 설정하는 역할을 합니다.
  4. 메소드 (getColor, getSpeed, setSpeed):
    • getColorgetSpeed는 각각 자동차의 색상과 속도를 반환합니다.
    • setSpeed는 자동차의 속도를 설정하는 데 사용됩니다.
  5. 객체 생성 및 사용 (main 함수 내):
    • Car myCar("Red", 0);: Car 클래스의 인스턴스인 myCar 객체를 생성합니다.
    • myCar 객체의 메소드를 호출하여 색상과 속도를 조회하고, 속도를 변경합니다.

[영진닷컴]그림으로 배우는 C++ Programming - 2nd Edition, 영진닷컴

이 예제는 객체지향 프로그래밍의 기본 개념인 클래스와 객체를 소개하는 간단한 예시입니다. 클래스는 객체의 청사진을 제공하며, 객체는 클래스의 실제 인스턴스입니다. 클래스의 메소드를 통해 객체의 내부 데이터를 안전하게 접근하고 수정할 수 있습니다.

접근 제어자(클래스와 객체)

C++에서 접근 제어자는 클래스의 멤버(변수와 함수)에 대한 접근 권한을 제어하는 키워드입니다. 주로 사용되는 접근 제어자는 public, private, protected 세 가지가 있습니다. 이들의 사용 방법과 각각의 특징을 아래에 자세히 설명하고 예를 들어 설명하겠습니다.

1. Public 접근 제어자

  • public으로 선언된 멤버는 클래스의 외부에서도 접근할 수 있습니다.
  • 주로, 외부에서 접근해야 하는 메소드나, 변수에 사용됩니다.
class ExampleClass {
public:
    int publicVar; // public 변수
    void publicMethod() { /* ... */ } // public 메소드
};

예시: ExampleClass 객체를 생성한 후, publicVar에 접근하거나 publicMethod()를 호출할 수 있습니다.

2. Private 접근 제어자

  • private으로 선언된 멤버는 클래스의 외부에서 접근할 수 없습니다.
  • 주로, 클래스 내부에서만 사용되는 데이터나 함수에 사용됩니다.
class ExampleClass {
private:
    int privateVar; // private 변수
    void privateMethod() { /* ... */ } // private 메소드
};

예시: privateVarprivateMethod()ExampleClass의 외부에서 직접 접근할 수 없습니다. 이를 사용하기 위해서는 public 메소드를 통해 간접적으로 접근해야 합니다.

3. Protected 접근 제어자

  • protected로 선언된 멤버는 해당 클래스 내부와 상속받은 파생 클래스에서 접근할 수 있습니다.
  • 주로, 상속받은 클래스에서도 사용할 수 있어야 하는 멤버에 사용됩니다.
class BaseClass {
protected:
    int protectedVar; // protected 변수
};

class DerivedClass : public BaseClass {
    void useProtectedVar() {
        protectedVar = 5; // 상속받은 클래스에서 protected 멤버에 접근 가능
    }
};

예시: DerivedClassBaseClass로부터 상속받아 protectedVar에 접근할 수 있습니다. 그러나 BaseClass의 객체로는 protectedVar에 직접 접근할 수 없습니다.

class Person {
private:
    string name;  // 외부에서 직접 접근할 수 없음

public:
    Person(string n) { name = n; }  // 생성자는 public
    void printName() { cout << "Name: " << name << endl; }  // 외부에서 호출 가능한 메소드
};
  • 예제에서 name 변수는 private으로 선언되어 Person 클래스 외부에서 직접 접근할 수 없습니다. 하지만 printName 메소드는 public으로 선언되어 외부에서 호출할 수 있으며, 이 메소드를 통해 간접적으로 name 변수의 값을 확인할 수 있습니다.

C++20: 풍부한 예제로 익히는 핵심 기능, 인사이트

이처럼 접근 제어자는 클래스의 캡슐화를 보장하고, 객체의 데이터와 메소드에 대한 접근을 제어하는 중요한 역할을 합니다. 이를 통해 객체의 데이터를 보호하고, 외부 인터페이스를 명확하게 정의할 수 있습니다.

생성자(Constructor)와 소멸자(Destructor)는 객체의 생명 주기를 관리(클래스와 객체)

C++에서 생성자(Constructor)와 소멸자(Destructor)는 객체의 생명 주기를 관리하는 특별한 함수들입니다. 이들은 객체가 생성되고 소멸될 때 자동으로 호출되며, 각각 객체의 초기화와 정리 작업을 담당합니다. 이들의 역할과 사용 방법에 대해 자세하게 설명하고, 예를 들어 설명하겠습니다.

생성자 (Constructor)

  • 객체가 생성될 때 자동으로 호출되는 멤버 함수입니다.
  • 주로 객체의 초기 상태를 설정하는 데 사용됩니다.
  • 생성자는 클래스 이름과 동일하며 반환 타입을 가지지 않습니다.
  • 여러 형태의 생성자가 있습니다: 디폴트 생성자, 매개변수가 있는 생성자, 복사 생성자 등.
class Car {
public:
    // 디폴트 생성자
    Car() {
        cout << "Car created with default constructor" << endl;
    }

    // 매개변수가 있는 생성자
    Car(string model) {
        cout << "Car created with model: " << model << endl;
    }
};

Car 클래스에는 두 개의 생성자가 정의되어 있습니다: 하나는 매개변수가 없고, 다른 하나는 string 타입의 model을 매개변수로 받습니다.

소멸자 (Destructor)

  • 객체가 소멸될 때 자동으로 호출되는 멤버 함수입니다.
  • 객체가 사용한 자원을 해제하거나 정리하는 데 사용됩니다.
  • 소멸자는 클래스 이름 앞에 물결표(~)가 붙으며 반환 타입을 가지지 않습니다.
  • 각 클래스에는 하나의 소멸자만 정의할 수 있습니다.
class Car {
public:
    // 생성자
    Car() {
        cout << "Car created" << endl;
    }

    // 소멸자
    ~Car() {
        cout << "Car destroyed" << endl;
    }
};

Car 클래스에는 생성자와 소멸자가 정의되어 있습니다. 객체가 생성될 때 “Car created”가 출력되고, 객체가 소멸될 때 “Car destroyed”가 출력됩니다.

생성자와 소멸자의 작동 방식

int main() {
    Car myCar; // Car 생성자 호출
    Car anotherCar("BMW"); // Car 매개변수가 있는 생성자 호출
    // 함수가 종료될 때 myCar, anotherCar 객체의 소멸자가 호출됨
}

뇌를 자극하는 C++ STL, 한빛미디어

  • main 함수에서 Car 객체 두 개를 생성합니다: myCar는 디폴트 생성자를 사용하고, anotherCar는 “BMW” 모델을 매개변수로 받는 생성자를 사용합니다.
  • 함수가 종료될 때, 생성된 객체들의 소멸자가 자동으로 호출되어 객체가 소멸됩니다.

생성자와 소멸자는 객체의 안정적인 생성과 소멸을 보장하는 중요한 구성 요소입니다. 생성자는 객체의 초기 상태를 설정하고, 소멸자는 객체가 더 이상 필요 없을 때 자원을 정리하는 역할을 합니다. 이를 통해 메모리 누수와 같은 문제를 방지하고, 프로그램의 안정성을 높일 수 있습니다.

결론

C++에서 접근 제어자는 클래스 멤버의 접근성을 관리하는 역할을 하며, public, private, protected 세 가지 유형이 있습니다. public 멤버는 외부에서 접근 가능하고, private 멤버는 클래스 내부에서만 접근 가능합니다. protected 멤버는 상속받은 클래스에서 접근할 수 있습니다. 이는 데이터 캡슐화와 보안을 강화하는 데 중요합니다. 반면, 생성자와 소멸자는 객체의 생명주기를 관리합니다. 생성자는 객체가 생성될 때 호출되어 초기화를 담당하고, 소멸자는 객체가 소멸될 때 자원을 해제합니다. 여러 형태의 생성자(디폴트, 매개변수가 있는, 복사 생성자 등)가 존재하며, 각각 특정 상황에 맞게 객체를 초기화합니다. 이러한 기능들은 C++의 객체지향 프로그래밍에서 핵심적인 요소로, 객체의 안전한 생성, 관리, 소멸을 보장하며 프로그램의 구조를 효율적으로 관리하는 데 중요한 역할을 합니다.