기초 상속
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 48번째.
상속(Inheritance)은 클래스가 다른 클래스의 속성과 동작을 물려받을 수 있게 해줍니다. 상속을 해주는 클래스는 기본 클래스(또는 부모 클래스)라고 하며, 상속을 받는 클래스는 파생 클래스(또는 자식 클래스)라고 합니다.
파생 클래스를 만들려면 콜론(:)을 사용하고 그 뒤에 접근 지정자와 기본 클래스 이름을 붙입니다:
class Animal {
public:
std::string name;
void eat() {
std::cout << name << " is eating" << std::endl;
}
};
class Dog : public Animal {
public:
void bark() {
std::cout << name << " says woof!" << std::endl;
}
};Dog 클래스는 이제 Animal로부터 name과 eat() 모두에 접근할 수 있으며, 자신만의 bark() 메서드도 가집니다. 이것이 상속의 본질입니다: 기존 코드를 재사용하면서 새로운 기능을 추가하는 것입니다.
Dog myDog;
myDog.name = "Buddy";
myDog.eat(); // Animal에서 상속됨
myDog.bark(); // Dog에 정의됨Animal 앞의 public 키워드는 상속 유형을 지정합니다. 공개 상속은 기본 클래스의 public 멤버가 파생 클래스에서도 public으로 유지됨을 의미합니다. 이것은 가장 일반적인 형태이며 "is-a" 관계를 모델링합니다: Dog 는 하나의 Animal 입니다.
챌린지
쉬움상속이 실제로 어떻게 작동하는지 보여주는 간단한 차량 계층 구조를 만들어 보겠습니다. 기본 클래스인 Vehicle 클래스와 이를 확장하여 특화된 동작을 추가한 파생 클래스 Motorcycle 클래스를 작성하게 됩니다.
코드는 다음 세 개의 파일로 구성됩니다:
Vehicle.h: 다음을 포함하는 기본Vehicle클래스를 정의합니다:- 공개(public)
std::string brand멤버 - 공개(public)
int year멤버 - 차량의 브랜드와 연도를
Brand: <brand>, Year: <year>형식으로 출력하는 공개 메서드displayInfo()
- 공개(public)
Motorcycle.h:Vehicle을 공개 상속받는Motorcycle클래스를 정의합니다. 이 파생 클래스에는 다음이 추가되어야 합니다:- 엔진 배기량을 위한 공개
int engineCC멤버 <brand> goes vroom vroom!을 출력하는 공개 메서드revEngine()
Motorcycle클래스는Vehicle로부터brand,year,displayInfo()를 자동으로 상속받습니다.- 엔진 배기량을 위한 공개
main.cpp: 세 개의 입력값(각각 별도의 줄에 입력됨)을 읽습니다:- 브랜드 이름 (문자열)
- 연도 (정수)
- 엔진 CC (정수)
Motorcycle객체를 생성하고, 상속받은 멤버(brand및year)와 자체 멤버인engineCC를 설정합니다. 그런 다음 상속받은 메서드와 모터사이클 전용 메서드를 모두 호출하여 상속을 확인합니다.출력 형식:
Brand: <brand>, Year: <year> Engine: <engineCC>cc <brand> goes vroom vroom!
예를 들어, 입력값이 Harley, 2022, 1200인 경우:
Brand: Harley, Year: 2022
Engine: 1200cc
Harley goes vroom vroom!헤더 파일에 헤더 가드(header guards)를 포함하는 것을 잊지 마세요. 또한 기본 클래스에 접근하기 위해 Motorcycle 헤더에서 #include "Vehicle.h"를 사용해야 합니다.
치트 시트
상속을 사용하면 클래스가 다른 클래스로부터 속성과 동작을 물려받을 수 있습니다. 상속을 해주는 클래스는 기본 클래스(부모)라고 하며, 상속을 받는 클래스는 파생 클래스(자식)라고 합니다.
파생 클래스를 만들려면 콜론 뒤에 접근 지정자와 기본 클래스 이름을 사용합니다:
class Animal {
public:
std::string name;
void eat() {
std::cout << name << " is eating" << std::endl;
}
};
class Dog : public Animal {
public:
void bark() {
std::cout << name << " says woof!" << std::endl;
}
};파생 클래스는 기본 클래스의 public 멤버와 자신의 멤버에 접근할 수 있습니다:
Dog myDog;
myDog.name = "Buddy";
myDog.eat(); // Animal로부터 상속됨
myDog.bark(); // Dog에서 정의됨public 키워드는 public 상속을 지정하며, 이는 기본 클래스의 public 멤버가 파생 클래스에서도 public으로 유지됨을 의미합니다. 이는 "is-a" 관계를 모델링합니다.
직접 해보기
#include <iostream>
#include <string>
#include "Motorcycle.h"
using namespace std;
int main() {
string brand;
int year;
int engineCC;
cin >> brand;
cin >> year;
cin >> engineCC;
// TODO: Motorcycle 객체 생성
// TODO: brand, year, engineCC 멤버 설정
// TODO: 상속된 정보를 표시하기 위해 displayInfo() 호출
// TODO: 엔진 정보를 다음 형식으로 출력: Engine: <engineCC>cc
// TODO: 오토바이 전용 동작을 보여주기 위해 revEngine() 호출
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.