본문 바로가기
IT/c++

C++ is-a 및 has-a 상속 조건

by 뉴코딩맨 2023. 8. 5.
C++ 프로그래밍에서 "is-a" 관계는 클래스 간의 상속 관계를 나타내며, "has-a" 관계는 클래스 내부에서 다른 클래스 객체를 포함하는 관계를 의미합니다. 이 두 관계는 객체 지향 프로그래밍에서 클래스 간의 연결성을 나타내는 중요한 개념입니다.

 

 

"is-a" 상속 조건

  1. 기본 클래스와 파생 클래스의 관련성: "is-a" 관계에서 파생 클래스는 기본 클래스와 동일한 유형이어야 합니다. 즉, 파생 클래스의 객체는 기본 클래스 객체의 특성을 모두 가집니다.
  2. 접근 지정자의 일치: 기본 클래스의 public 멤버는 파생 클래스에서 public으로 상속되어야 합니다. 이렇게 함으로써 파생 클래스의 객체가 기본 클래스 객체처럼 사용될 수 있습니다.

"has-a" 상속 조건

  1. 포함 관계의 정의: "has-a" 관계에서는 클래스 내부에 다른 클래스의 객체를 포함합니다. 이를 포함 객체라고 부르며, 포함 객체는 클래스의 멤버 변수로 선언됩니다.
  2. 캡슐화와 은닉화: "has-a" 관계를 구현할 때는 캡슐화와 은닉화 원칙을 따라야 합니다. 즉, 포함 객체의 내부 상세는 외부에 노출되지 않도록 보호되어야 합니다.

예시

 

 

#include <iostream>

// "is-a" 관계 예시: 기본 클래스와 파생 클래스
class Shape {
public:
    virtual void draw() {
        std::cout << "도형을 그립니다." << std::endl;
    }
};

class Circle : public Shape {
public:
    void draw() override {
        std::cout << "원을 그립니다." << std::endl;
    }
};

// "has-a" 관계 예시: 포함 객체와 클래스
class Engine {
public:
    void start() {
        std::cout << "엔진을 가동합니다." << std::endl;
    }
};

class Car {
private:
    Engine carEngine;

public:
    void startCar() {
        carEngine.start();
        std::cout << "자동차를 출발합니다." << std::endl;
    }
};

int main() {
    Circle myCircle;
    myCircle.draw(); // "is-a" 관계 활용 예시

    Car myCar;
    myCar.startCar(); // "has-a" 관계 활용 예시

    return 0;
}
 
위 예시에서 Circle 클래스는 Shape 클래스를 상속하여 "is-a" 관계를 나타냅니다. 또한 Car 클래스는 Engine 클래스를 멤버로 포함하여 "has-a" 관계를 나타냅니다.

 

 

C++ 클래스 상속이란?

C++ 프로그래밍에서 클래스 상속은 객체 지향 프로그래밍의 중요한 개념 중 하나입니다. 이를 통해 이미 정의된 클래스의 특성과 기능을 다른 클래스에서 활용할 수 있으며, 코드의 재사용성과

newcodingman.tistory.com

 

댓글