μ΄λ² ν¬μ€ν λΆν°λ κ²½μ΄μ²΄λ‘ κΈμ μ°κ² μλλ€. μ¬νκΉμ§ νμ΄μ²΄λ‘ ν¬μ€ν νλλ°, λ±λ±ν λλμ΄ λ€μ΄μ μ§κΈλΆν°λ μ’ λ μΉμ νκ² μμΈνκ² μ€λͺ νλ €κ³ κ²½μ΄μ²΄λ₯Ό μ¬μ©νκ² μ΅λλ€!
μμ(Inheritance)
κ°μ²΄ μ§ν₯μ 4λ μμΉ(μΊ‘μν, μΆμν, μμ, λ€νμ±) μ€ μμ κ·Έλ¦¬κ³ λ€νμ±μ λ€λ€λ³΄λ €κ³ ν©λλ€. μμμ κ°μ²΄μ§ν₯μ κ½μ΄μ ν΅μ¬μ΄λΌκ³ λ ν μ μμ΅λλ€. ν΄λμ€ μ체λ§μΌλ‘λ κ°μ²΄λΌλ¦¬μ κ΄κ³λ₯Ό νννλ€λ©΄, μμμ ν΅ν λ€νμ±μ κ°μ²΄ κ°μ κ΄κ³λ₯Ό λμ± νμ±νκ³ μ½κ² ννν μ μλλ‘ νμ£ .
μμμ ν΅ν΄ κΈ°μ‘΄μ μ μλ ν΄λμ€λ₯Ό κΈ°λ°μΌλ‘ μλ‘μ΄ ν΄λμ€λ₯Ό μ μν μ μμΌλ©°, 곡ν΅λ κ²μ 곡μ νκ³ νμ₯ κ°λ₯νλλ‘ λ§λ€ μ μμ΅λλ€. μμμ ν΄λμ€ κ°μ κ΄κ³λ₯Ό μ€μ νμ¬ μ½λ μ¬μ¬μ©κ³Ό κ³μΈ΅μ ꡬ쑰λ₯Ό ꡬμΆνλ λ° μ¬μ©λ©λλ€. ν ν΄λμ€(νμ ν΄λμ€ λλ νμ ν΄λμ€)κ° λ€λ₯Έ ν΄λμ€(κΈ°λ³Έ ν΄λμ€ λλ μμ ν΄λμ€)μ νΉμ±κ³Ό λμμ μμλ°μ νμ₯ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ½λμ μ€λ³΅μ νΌνκ³ μ μ§λ³΄μμ±μ ν₯μμν¬ μ μμ΅λλ€.
μμ κ΄κ³μμλ λΆλͺ¨-μμμ΄λΌλ ννμ λ§μ΄ μ¬μ©νλ©° κΈ°λ³Έ ν΄λμ€(Base class)μ νμ(Derived class)λ‘λ λ§μ΄ μ¬μ©ν©λλ€.
C++μμ μμμ μ μνλ €λ©΄ νμ ν΄λμ€λ₯Ό μ μΈνκ³ κΈ°λ³Έ ν΄λμ€λ₯Ό μ§μ ν΄μΌ ν©λλ€. ν΄λμ€ μ μΈ μ κΈ°λ³Έ ν΄λμ€λ₯Ό μ§μ νκΈ° μν΄ νμ ν΄λμ€μ μ μΈλΆμ μ½λ‘ (:)μ μ¬μ©νλ©°, μ΄μ΄μ μ κ·Ό μ§μ μμ ν¨κ» κΈ°λ³Έ ν΄λμ€μ μ΄λ¦μ λͺ
μν©λλ€. μμμ μ κ·Ό μ§μ μλ νμ ν΄λμ€μμ κΈ°λ³Έ ν΄λμ€μ λ©€λ²μ λν μ κ·Ό κΆνμ μ μ΄νλ μν μ ν©λλ€.
class BaseClass {
// κΈ°λ³Έ ν΄λμ€ λ©€λ²λ€
};
class DerivedClass : μ κ·Ό_μ§μ μ BaseClass {
// νμ ν΄λμ€ λ©€λ²λ€
};
C++μμ μμμ λ€μκ³Ό κ°μ μΈ κ°μ§ μ νμΌλ‘ ꡬλΆλ©λλ€:
βοΈ κ³΅κ° μμ(Public Inheritance): public μ κ·Ό μ§μ μλ₯Ό μ¬μ©νμ¬ μμν©λλ€. μ΄ κ²½μ°, κΈ°λ³Έ ν΄λμ€μ λͺ¨λ κ³΅κ° λ©€λ²λ νμ ν΄λμ€μμλ κ³΅κ° λ©€λ²λ‘ μμλ©λλ€.
βοΈ λ³΄νΈ μμ(Protected Inheritance): protected μ κ·Ό μ§μ μλ₯Ό μ¬μ©νμ¬ μμν©λλ€. μ΄ κ²½μ°, κΈ°λ³Έ ν΄λμ€μ λͺ¨λ κ³΅κ° λ° λ³΄νΈ λ©€λ²λ νμ ν΄λμ€μμ λ³΄νΈ λ©€λ²λ‘ μμλ©λλ€.
βοΈ λΉκ³΅κ° μμ(Private Inheritance): private μ κ·Ό μ§μ μλ₯Ό μ¬μ©νμ¬ μμν©λλ€. μ΄ κ²½μ°, κΈ°λ³Έ ν΄λμ€μ λͺ¨λ λ©€λ²λ νμ ν΄λμ€μμ λΉκ³΅κ° λ©€λ²λ‘ μμλ©λλ€.
νμ ν΄λμ€λ κΈ°λ³Έ ν΄λμ€μμ μμλ°μ λ©€λ²λ₯Ό μ¬μ©ν μ μμΌλ©°, νμμ λ°λΌ μλ‘μ΄ λ©€λ²λ₯Ό μΆκ°νκ±°λ κΈ°μ‘΄ λ©€λ²λ₯Ό μ¬μ μ(μ€λ²λΌμ΄λ©)ν μ μμ΅λλ€. μμλ°μ λ©€λ²μ μ κ·ΌνκΈ° μν΄ . μ°μ°μλ₯Ό μ¬μ©ν μ μμ΅λλ€. λν, νμ ν΄λμ€μ μμ±μμμ κΈ°λ³Έ ν΄λμ€μ μμ±μλ₯Ό νΈμΆνμ¬ μ΄κΈ°ννλ κ²μ΄ μΌλ°μ μ
λλ€.
#include <iostream>
// κΈ°λ³Έ ν΄λμ€: λλ¬Ό
class Animal {
public:
void eat() {
std::cout << "λλ¬Όμ΄ λ¨Ήκ³ μμ΅λλ€." << std::endl;
}
};
// νμ ν΄λμ€: κ³ μμ΄
class Cat : public Animal {
public:
void meow() {
std::cout << "κ³ μμ΄κ° μΌμΉ μ리λ₯Ό λ΄κ³ μμ΅λλ€." << std::endl;
}
};
int main() {
// νμ ν΄λμ€μ κ°μ²΄ μμ±
Cat cat;
// μμλ°μ κΈ°λ³Έ ν΄λμ€μ λ©€λ² μ¬μ©
cat.eat();
// νμ ν΄λμ€μ λ©€λ² μ¬μ©
cat.meow();
return 0;
}
/* μ€νκ²°κ³Ό
λλ¬Όμ΄ λ¨Ήκ³ μμ΅λλ€.
κ³ μμ΄κ° μΌμΉ μ리λ₯Ό λ΄κ³ μμ΅λλ€.
*/
λ€μ€ μμ(Multiple Inheritance)μ΄λΌκ³ νλ κ°λ λ μμΌλ©°, C++μμλ ν΄λμ€κ° λ κ° μ΄μμ ν΄λμ€λ‘λΆν° λμμ μμλ°μ μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ λ€λ₯Έ ν΄λμ€μ νΉμ±κ³Ό λμμ μ‘°ν©νμ¬ μλ‘μ΄ ν΄λμ€λ₯Ό μ μν μ μμ΅λλ€. λ€μ€ μμμ μ μ©νμ§λ§ μ½λμ 볡μ‘μ±μ μ¦κ°μν¬ μ μμΌλ―λ‘ μ μ€νκ² μ¬μ©ν΄μΌ ν©λλ€.
κ°μ ν¨μ(Virtual Function)μ μ€λ²λΌμ΄λ©(Overriding)
κ°μ ν¨μ(Virtual Function)λ κΈ°λ³Έ ν΄λμ€μ νμ ν΄λμ€ μ¬μ΄μμ λμ λ°μΈλ©μ μ§μνκΈ° μν΄ μ¬μ©λλ ν¨μμ
λλ€. λμ λ°μΈλ©μ μ€ν μκ°μ μ μ ν ν¨μλ₯Ό νΈμΆνκΈ° μν΄ κ°μ ν¨μ ν
μ΄λΈ(virtual function table)μ μ¬μ©νλ λ©μ»€λμ¦μ
λλ€. κ°μ ν¨μλ κΈ°λ³Έ ν΄λμ€μμ μ μλλ©°, νμ ν΄λμ€μμ νμμ λ°λΌ μ¬μ μ(μ€λ²λΌμ΄λ©)λ μ μμ΅λλ€.
κ°μ ν¨μλ₯Ό μ¬μ©νκΈ° μν΄μλ λ€μκ³Ό κ°μ κ·μΉμ λ°λΌμΌ ν©λλ€:
1. κΈ°λ³Έ ν΄λμ€μμ κ°μ ν¨μλ₯Ό μ μΈν λ virtual ν€μλλ₯Ό μ¬μ©ν©λλ€.
2. νμ ν΄λμ€μμ λμΌν μ΄λ¦κ³Ό μκ·Έλμ²λ₯Ό κ°μ§ ν¨μλ₯Ό override ν€μλμ ν¨κ» μ¬μ μν©λλ€.
3. κ°μ ν¨μλ μΌλ°μ μΌλ‘ κΈ°λ³Έ ν΄λμ€μ λ©€λ² ν¨μλ‘ μ μΈλ©λλ€. κΈ°λ³Έ ν΄λμ€μμ κ°μ ν¨μλ₯Ό μμ κ°μ ν¨μλ‘ μ μΈν μλ μμ΅λλ€.
#include <iostream>
// κΈ°λ³Έ ν΄λμ€: λλ¬Ό
class Animal {
protected:
int age = 1;
int numOfLegs = 4;
public:
void walk() {
std::cout << "λλ¬Όμ΄ " << numOfLegs << "κ°μ λ°λ‘ κ±·κ³ μμ΅λλ€." << std::endl;
}
virtual void sound() {
std::cout << "λλ¬Όμ΄ μ리λ₯Ό λ΄κ³ μμ΅λλ€." << std::endl;
}
};
// νμ ν΄λμ€: κ³ μμ΄
class Cat : public Animal {
public:
virtual void sound() override final {
std::cout << "κ³ μμ΄κ° μΌμΉ μ리λ₯Ό λ΄κ³ μμ΅λλ€." << std::endl;
}
void jump() {
std::cout << "κ³ μμ΄κ° μ ν νκ³ μμ΅λλ€." << std::endl;
}
void setAge(int _age) {
age = _age;
}
void setLegs(int _legs) {
numOfLegs = _legs;
}
};
int main() {
// νμ ν΄λμ€μ κ°μ²΄ μμ±
Cat cat;
// κΈ°λ³Έ ν΄λμ€μ λ©€λ² λ³μ μ κ·Ό
cat.setAge(10);
cat.setLegs(4);
// νμ ν΄λμ€μ λ©€λ² ν¨μ νΈμΆ
cat.jump();
// μ€λ²λΌμ΄λ©λ λ©€λ² ν¨μ νΈμΆ
cat.sound();
// κΈ°λ³Έ ν΄λμ€μ λ©€λ² ν¨μ νΈμΆ
cat.Animal::sound();
return 0;
}
/* μΆλ ₯ κ²°κ³Ό
κ³ μμ΄κ° μ ν νκ³ μμ΅λλ€.
λλ¬Όμ΄ 4κ°μ λ°λ‘ κ±·κ³ μμ΅λλ€.
κ³ μμ΄κ° μΌμΉ μ리λ₯Ό λ΄κ³ μμ΅λλ€.
λλ¬Όμ΄ μ리λ₯Ό λ΄κ³ μμ΅λλ€.
*/
protectedλ μμ κ΄κ³μμ μμμ΄ λΆλͺ¨μ λ©€λ²μ μ κ·Ό κ°λ₯νλλ‘ ν©λλ€. μ μμ μμλ μμ ν΄λμ€μΈ Catμ΄ λΆλͺ¨ ν΄λμ€μΈ Animal ν΄λμ€μ ageμ numOfLegsμ μ κ·Ό κ°λ₯ν©λλ€. λ¬Όλ‘ publicμ μλκΈ° λλ¬Έμ main ν¨μμμ cat.age = 4;λ λΆκ°λ₯ν©λλ€.λΆλͺ¨λ, μμλ μλ μΈλΆλκΉμ.
κ·Έλ¦¬κ³ λ©μλ μ€λ²λΌμ΄λ©(Method Overriding)μ λΆλͺ¨ ν΄λμ€μ μ μλ ν¨μλ₯Ό μμ ν΄λμ€μμ μ¬μ μ νλ κ²μ λ§ν©λλ€. λ°λΌμ ν¨μμ μ μΈ κ΅¬μ‘°λ₯Ό κ·Έλλ‘ λ°λΌκ°μΌ ν©λλ€. κ·Έλ¦¬κ³ μμ ν΄λμ€μμλ μ΄ ν¨μκ° μ¬μ μ λμλ€λ κ²μ νκΈ°νκΈ° μν΄ ν¨μ μμ overrideλ₯Ό λΆμ λλ€. κ·Έλ¦¬κ³ μ¬λ¬ λ¨κ³μ μμμ΄ μκ³ , μ¬μ μλ₯Ό μμμ μμμμλ ν μ μκΈ° λλ¬Έμ μ¬κΈ°κ° λ§μ§λ§ μ¬μ μλΌλ κ²μ μλ―Ένλ finalλ λΆμμ΅λλ€.
λ€μμ μμ κ°μ ν¨μμ μΆμ ν΄λμ€, κ·Έλ¦¬κ³ λ€νμ±μ λν΄ μμλ³΄κ² μ΅λλ€!
'νλ‘κ·Έλλ° μΈμ΄ > C++ κΈ°μ΄' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[C++] 16-3. μμ(Inheritance)κ΄κ³μ μΈμ€ν΄μ€ μμ±, μλ©Έ (0) | 2023.06.29 |
---|---|
[C++] 16-2. λ€νμ±(Polymorphism)κ³Ό μΆμ ν΄λμ€(Abstract Class) (0) | 2023.06.24 |
[C++] 15. ν΄λμ€(class)μ ꡬ쑰체(struct) (0) | 2023.06.09 |
[C++] 14. μ°Έμ‘°μ(Reference) (0) | 2023.06.02 |
[C++] 13-2. κΈ°λ³Έμ μΆλ ₯κ³Ό νμΌμ μΆλ ₯(feat. iostream, ifstream, ofstream, stringstream) (0) | 2023.05.19 |
λκΈ