C_C++

C++, 클래스 기초: 자동차 클래스를 상속한 전기차

고니자니 2024. 10. 20. 15:53
반응형

C++에서 자동차를 모델로 기초적인 클래스를 작성하려면, 클래스는 객체 지향 프로그래밍의 핵심 개념인 추상화, 캡슐화, 상속 및 다형성을 잘 설명할 수 있습니다. 자동차를 예로 들어 기초적인 클래스 내용을 요약해 보겠습니다.

 

1. 클래스 정의

C++에서 클래스는 객체의 청사진입니다. 자동차를 모델링하기 위해 Car 클래스를 만들 수 있습니다.

#include <iostream>
using namespace std;

class Car {
private:
    // 멤버 변수
    string make;    // 제조사
    string model;   // 모델명
    int year;            // 제조 연도
    double fuelLevel;    // 연료량

public:
    // 생성자
    Car(string carMake, string carModel, int carYear, double carFuelLevel)
        : make(carMake), model(carModel), year(carYear), fuelLevel(carFuelLevel) { }

    // 멤버 함수
    void drive(double distance) {
        // 주행 후 연료 소비
        double fuelConsumption = distance * 0.1;
        fuelLevel -= fuelConsumption;
        cout << "주행 " << distance << " km. 연료량: " << fuelLevel << "L\n";
    }

    void refuel(double amount) {
        fuelLevel += amount;
        cout << "급유 " << amount << "L. 현재 연료량: " << fuelLevel << "L\n";
    }

    // 자동차 정보를 출력하는 함수
    void displayInfo() {
        cout << "제조사: " << make << ", 모델: " << model
            << ", 년식: " << year << ", 연료량: " << fuelLevel << "L\n";
    }
};

int main()
{
    Car c("현대자동차", "쏘나타", 2024, 40);
    c.drive(10);
    c.refuel(15);
    c.displayInfo();

    return 0;
}

(Output)

주행 10 km. 연료량: 39L
급유 15L. 현재 연료량: 54L
제조사: 현대자동차, 모델: 쏘나타, 년식: 2024, 연료량: 54L

C++, 클래스 기초: 자동차 클래스를 상속한 전기차

 

2. 캡슐화 (Encapsulation)

캡슐화는 데이터를 외부에서 직접 접근하지 못하게 하고, 대신 퍼블릭 멤버 함수를 통해 접근하도록 하는 기법입니다. 위의 예에서 make, model, year, fuelLevel과 같은 변수들은 private으로 선언되어 외부에서 직접 접근할 수 없습니다. 대신, drive(), refuel(), displayInfo() 같은 퍼블릭 멤버 함수로 데이터를 간접적으로 조작합니다.

 

3. 추상화 (Abstraction)

추상화는 객체의 복잡한 세부 사항을 숨기고 중요한 특성만을 드러내는 기법입니다. Car 클래스는 연료 관리와 주행 등의 기능을 추상화하여 drive(), refuel() 함수로 간단하게 제공합니다.

 

4. 상속 (Inheritance)

Car 클래스를 기반으로 스포츠카나 전기차와 같은 파생 클래스들을 만들 수 있습니다. 예를 들어:

#include <iostream>
using namespace std;

class Car {
private:
    // 멤버 변수
    string make;    // 제조사
    string model;   // 모델명
    int year;            // 제조 연도
    double fuelLevel;    // 연료량

public:
    // 생성자
    Car(string carMake, string carModel, int carYear, double carFuelLevel)
        : make(carMake), model(carModel), year(carYear), fuelLevel(carFuelLevel) { }

    // 멤버 함수
    void drive(double distance) {
        // 주행 후 연료 소비
        double fuelConsumption = distance * 0.1;
        fuelLevel -= fuelConsumption;
        cout << "주행 " << distance << " km. 연료량: " << fuelLevel << "L\n";
    }

    void refuel(double amount) {
        fuelLevel += amount;
        cout << "급유 " << amount << "L. 현재 연료량: " << fuelLevel << "L\n";
    }

    // 자동차 정보를 출력하는 함수
    void displayInfo() {
        cout << "제조사: " << make << ", 모델: " << model
            << ", 년식: " << year << ", 연료량: " << fuelLevel << "L\n";
    }
};

class ElectricCar : public Car {
private:
    double batteryLevel;

public:
    ElectricCar(string carMake, string carModel, int carYear, double batteryLevel)
        : Car(carMake, carModel, carYear, 0), batteryLevel(batteryLevel) {}

    void charge(double amount) {
        batteryLevel += amount;
        cout << "배터리 충전. 현재 배터리 잔량: " << batteryLevel << "%\n";
    }

    // 기존의 drive 함수를 재정의 (다형성)
    void drive(double distance) {
        double batteryConsumption = distance * 0.05;
        batteryLevel -= batteryConsumption;
        cout << "주행 " << distance << " km. 배터리 잔량: " << batteryLevel << "%\n";
    }
};

int main()
{
    Car c("현대자동차", "쏘나타", 2024, 40);
    c.drive(10);
    c.refuel(15);
    c.displayInfo();

    cout << "\nElectricCar" << endl;
    ElectricCar ec("기아자동차", "EV8", 2024, 100);
    ec.drive(500);
    ec.charge(10);
    ec.drive(800);
    return 0;
}

(Output)

주행 10 km. 연료량: 39L
급유 15L. 현재 연료량: 54L
제조사: 현대자동차, 모델: 쏘나타, 년식: 2024, 연료량: 54L

ElectricCar
주행 500 km. 배터리 잔량: 75%
배터리 충전. 현재 배터리 잔량: 85%
주행 800 km. 배터리 잔량: 45%

C++, 클래스 기초: 자동차 클래스를 상속한 전기차

 

5. 다형성 (Polymorphism)

 

위 예시에서 볼 수 있듯이, ElectricCar는 Car 클래스에서 상속받아 기능을 재정의(오버라이드)할 수 있습니다. 이처럼 다형성은 파생 클래스가 기본 클래스의 메서드를 자신에게 맞게 구현할 수 있도록 해줍니다.

 

요약

캡슐화: 멤버 변수를 private으로 보호하고 퍼블릭 메서드를 통해 접근.
추상화: 주행, 연료 관리 등의 기능을 멤버 함수로 추상화.
상속: Car 클래스를 확장해 전기차 등의 새로운 클래스를 정의.
다형성: 파생 클래스에서 기본 클래스의 메서드를 재정의.
이런 기초적인 구조를 바탕으로 다양한 자동차 모델을 객체로 만들고 관리할 수 있습니다

.

 

반응형