C++ 상속: 초보자 가이드
안녕하세요, 미래의 C++ 마법사 여러분! 오늘, 우리는 C++ 상속의 흥미로운 세계로 여정을 떠날 거예요. 프로그래밍에 새로운 사람이라도 걱정하지 마세요 – 저는 여러분의 친절한 가이드가 될 거예요 및 저희는 걸음을 따라가겠습니다. 이 튜토리얼 끝에는 얼마나 많은 것을 배웠는지 놀라실 거예요!
상속이란 무엇인가요?
물론에 들어가기 전에, 간단한 비유로 시작해볼게요. 가족 트리를 만드는 것을 상상해보세요. 자식들이 부모들那里에서 성격을 상속받듯이, C++에서는 클래스가 다른 클래스의 속성과 행동을 상속받을 수 있습니다. 멋질지요?
상속은 오브젝트-지향 프로그래밍의 기본 개념 중 하나로, 기존 클래스를 기반으로 새로운 클래스를 만들 수 있게 해줍니다. 이는 코드 재사용을 촉진하고, 우리의 코드를 계층적 구조로 정리하는 데 도움이 됩니다.
베이스 클래스와 파생 클래스
C++ 상속의 세계에서는 두 가지 주요 역할이 있습니다: 베이스 클래스와 파생 클래스입니다.
베이스 클래스
베이스 클래스(부모 클래스이거나 슈퍼클래스로도 불림)는 다른 클래스가 상속받는 클래스입니다. 이는 우리의 가족 트리 비유에서 조상과 같습니다.
간단한 베이스 클래스를 만들어볼게요:
class Animal {
public:
void eat() {
cout << "This animal is eating." << endl;
}
void sleep() {
cout << "This animal is sleeping." << endl;
}
};
이 예제에서, Animal
은 우리의 베이스 클래스입니다. 두 가지 메서드가 있습니다: eat()
과 sleep()
. 이는 대부분의 동물이 공유하는 공통적인 행동입니다.
파생 클래스
파생 클래스(자식 클래스이거나 서브클래스로도 불림)는 베이스 클래스에서 상속받는 클래스입니다. 이는 우리의 가족 트리에서의 자손과 같습니다.
파생 클래스를 만들어볼게요:
class Dog : public Animal {
public:
void bark() {
cout << "Woof! Woof!" << endl;
}
};
여기서, Dog
은 우리의 파생 클래스입니다. Animal
에서 상속받기 때문에 eat()
과 sleep()
메서드를 자동으로 가집니다. 또한 Dog
에 특화된 새로운 메서드 bark()
를 추가했습니다.
이제 이 클래스들을 어떻게 사용할 수 있는지 볼게요:
int main() {
Dog myDog;
myDog.eat(); // 출력: This animal is eating.
myDog.sleep(); // 출력: This animal is sleeping.
myDog.bark(); // 출력: Woof! Woof!
return 0;
}
멋지지 않나요? 우리의 Dog
클래스는 새로 쓰기보다 Animal
클래스의 메서드를 사용할 수 있습니다!
접근 제어와 상속
이제 C++ 가족에서 누가 무엇을 볼 수 있는지 이야기해볼게요. 실제 가족처럼 몇 가지는 공개된 지식이고, 몇 가지는 가족 구성원만이 알고 있는 것이고, 몇 가지는 개인적인 비밀입니다.
C++에서는 세 가지 접근 수준이 있습니다:
- 공개
- 보호
- 비공개
이들이 상속과 어떻게 작동하는지 볼게요:
class Animal {
public:
int age;
protected:
string name;
private:
int secretCode;
};
class Dog : public Animal {
public:
void setName(string n) {
name = n; // OK, 'name'은 Animal에서 보호됨
}
void setSecretCode(int code) {
// secretCode = code; // 오류! 'secretCode'은 Animal에서 비공개됨
}
};
이 예제에서:
-
age
는 공개되어 어디서든 접근할 수 있습니다. -
name
은 보호되어Animal
과Animal
에서 상속받은 모든 클래스에서 접근할 수 있습니다. -
secretCode
는 비공개되어Animal
클래스 내에서만 접근할 수 있습니다.
상속 유형
C++는 다양한 필요에 맞게 다양한 상속 품종을 제공합니다. 이제 탐험해볼게요!
단일 상속
이것은 가장 간단한 형태로, 클래스가 단지 하나의 베이스 클래스에서 상속받는 것입니다. 우리는 이미 Dog
예제에서 이를 본 적이 있습니다.
다중 층상속
이는 가족 계보와 같은 것으로, 손자가 아버지那里에서 상속받고, 아버지는 조부那里에서 상속받습니다.
class Animal {
public:
void eat() { cout << "Eating..." << endl; }
};
class Mammal : public Animal {
public:
void breathe() { cout << "Breathing..." << endl; }
};
class Dog : public Mammal {
public:
void bark() { cout << "Barking..." << endl; }
};
int main() {
Dog myDog;
myDog.eat(); // From Animal
myDog.breathe(); // From Mammal
myDog.bark(); // From Dog
return 0;
}
계층 상속
이는 하나의 베이스 클래스에서 여러 클래스가 상속받는 것입니다. 가족에서 형제와 같은 것으로 생각할 수 있습니다.
class Animal {
public:
void eat() { cout << "Eating..." << endl; }
};
class Dog : public Animal {
public:
void bark() { cout << "Barking..." << endl; }
};
class Cat : public Animal {
public:
void meow() { cout << "Meowing..." << endl; }
};
다중 상속
다중 상속은 클래스가 두 개 이상의 베이스 클래스에서 상속받는 것입니다. 부모님 모두那里에서 특성을 가지는 것과 같습니다!
class FlyingCreature {
public:
void fly() { cout << "Flying..." << endl; }
};
class SwimmingCreature {
public:
void swim() { cout << "Swimming..." << endl; }
};
class Duck : public FlyingCreature, public SwimmingCreature {
public:
void quack() { cout << "Quacking..." << endl; }
};
int main() {
Duck myDuck;
myDuck.fly(); // From FlyingCreature
myDuck.swim(); // From SwimmingCreature
myDuck.quack(); // From Duck
return 0;
}
하지만 주의하세요! 신중하지 않게 사용하면 유명한 "다이아몬드 문제"를 일으킬 수 있습니다.
상속 방법 표
다음은 우리가 논의한 상속 방법을 요약한 편리한 표입니다:
상속 유형 | 설명 | 예제 |
---|---|---|
단일 | 클래스가 하나의 베이스 클래스에서 상속받음 | Dog : public Animal |
다중 층 | 클래스가 파생 클래스에서 상속받음 | Dog : public Mammal, Mammal : public Animal |
계층 | 여러 클래스가 하나의 베이스 클래스에서 상속받음 | Dog : public Animal, Cat : public Animal |
다중 | 클래스가 여러 베이스 클래스에서 상속받음 | Duck : public FlyingCreature, public SwimmingCreature |
그리고 이렇게 끝나겠죠! 우리는 C++ 상속의 기본 개념을 다루었습니다. 기억하세요, 연습이 실력을 만든다는 말이 있으니, 이 개념들을 실험해보세요. 코딩 잘 하세요, 상속이 여러분과 함께하길 바랍니다!
Credits: Image by storyset