μμ κ΄κ³μμ μμ±λλ μΈμ€ν΄μ€μ μ ν μ€ λ€νμ±μ κΈ°λ°μΌλ‘ λ§λ€μ΄μ§ μΈμ€ν΄μ€λ λ³΄ν΅ νμν΄λμ€(Derived Class)λ₯Ό ν΅ν΄ κΈ°λ³Έ ν΄λμ€(Base Class)λ₯Ό μ΄κΈ°νν©λλ€. μμ κ΄κ³μμ νμ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ§λ λ€ νλλΌλ λ΄λΆμ μΌλ‘λ κΈ°λ³Έ ν΄λμ€μ μΈμ€ν΄μ€κΉμ§ λ§λ€μ΄μ§μ§λ§ κΈ°λ³Έ ν΄λμ€μ μμ±μλ μμλ‘ νΈμΆν μ μκΈ° λλ¬Έμ λλ€.
λ°λλ‘ μΈμ€ν΄μ€μ μλ©Έλ λ§μ°¬κ°μ§μ λλ€. νμ ν΄λμ€λ§ μλ©Ένκ³ κΈ°λ³Έ ν΄λμ€μ μμμ΄ μλ©Έλμ§ μμΌλ©΄ λ©λͺ¨λ¦¬ λμ(Memory Leak)κ° λ°μν κ°λ₯μ±μ΄ μκΈ° λλ¬Έμ μ΄ λν νμ ν΄λμ€μμ μ± μμ ΈμΌ ν©λλ€.
μμ±μ(Contructor)
κΈ°λ³Έ ν΄λμ€(Base Class)μ μμ±μ νΈμΆ: νμ ν΄λμ€(Derived Class)μ μμ±μκ° νΈμΆλκΈ° μ μ λ¨Όμ κΈ°λ³Έ ν΄λμ€μ μμ±μκ° νΈμΆλ©λλ€. κΈ°λ³Έ ν΄λμ€μ μμ±μλ ν΄λΉ ν΄λμ€μ λ©€λ² λ³μ λ° κΈ°ν μ΄κΈ°νλ₯Ό λ΄λΉν©λλ€. κΈ°λ³Έ ν΄λμ€μ μμ±μ νΈμΆμ νμ ν΄λμ€μ μμ±μμ μ΄κΈ°ν λͺ©λ‘(initialization list)μμ μνλ©λλ€.
νμ ν΄λμ€(Derived Class)μ μμ±μ νΈμΆ: κΈ°λ³Έ ν΄λμ€μ μμ±μ νΈμΆμ΄ μλ£λλ©΄, νμ ν΄λμ€μ μμ±μκ° νΈμΆλ©λλ€. νμ ν΄λμ€μ μμ±μλ κΈ°λ³Έ ν΄λμ€μ μμ±μ νΈμΆ νμ μ€νλλ μ½λλ₯Ό ν¬ν¨ν©λλ€. μ΄ μ½λλ νμ ν΄λμ€μ λ©€λ² λ³μλ₯Ό μ΄κΈ°ννκ±°λ μΆκ°μ μΈ μμ
μ μννλ λ° μ¬μ©λ©λλ€.
μμ κ΄κ³μμ νμ ν΄λμ€μ μμ±μλ κΈ°λ³Έ ν΄λμ€μ μμ±μλ₯Ό νΈμΆν΄μΌ ν©λλ€. μ΄λ κ² νλ©΄ κΈ°λ³Έ ν΄λμ€μ λ©€λ² λ³μκ° μ¬λ°λ₯΄κ² μ΄κΈ°νλκ³ , νμ ν΄λμ€μ μμ±μμμλ ν΄λΉ ν΄λμ€μ νΉνλ μμ
μ μνν μ μμ΅λλ€.
class Base {
private:
int baseValue;
public:
Base(int value) : baseValue(value)
{
// κΈ°λ³Έ ν΄λμ€ μμ±μμ μ½λ
// λ©€λ² λ³μ μ΄κΈ°ν λ±μ μν
}
};
class Derived : public Base {
private:
int derivedValue;
public:
Derived(int value1, int value2) : Base(value)
{
derivedValue = value2;
// νμ ν΄λμ€ μμ±μμ μ½λ
// λ©€λ² λ³μ μ΄κΈ°ν λ° μΆκ° μμ
μν
}
};
μ κ°λ¨ν μμ μμ, μμ ν΄λμ€(νμ ν΄λμ€)λ 2κ°μ μμ±μ μΈμλ₯Ό λ°κ³ κ·Έμ€ νλλ λΆλͺ¨ ν΄λμ€(κΈ°λ³Έ ν΄λμ€)μ μμ±μλ₯Ό νΈμΆνλ©°, λλ¨Έμ§ νλλ μμ μ΄ μ¬μ©ν©λλ€. λ§μ½ λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό μμ ν΄λμ€μμ μ± μμ§μ§ μλλ€λ©΄, λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό νΈμΆν μ μλ λ°©λ²μ μμ΅λλ€.
λ¬Όλ‘ , λΆλͺ¨ν΄λμ€μ μμ±μμμ ν΄μΌνλ μΌμ initκ³Ό κ°μ ν¨μλ₯Ό λ§λ€μ΄μ νΈμΆν μ μμ΅λλ€. μ΄λκΉμ§λ μμ±μμ μ΄μΌκΈ°μ λλ€. λλΆλΆμ λ©€λ²λ³μμ μ΄κΈ°νλ μμ±μκ° λ§‘κ³ μκΈ° λλ¬Έμ μμ κ°μ΄ λΆλͺ¨ ν΄λμ€μ μμ±μ νΈμΆμ΄ λ§€μ° μΌλ°μ μ λλ€.
μλ©Έμ(Destructor)
νμ ν΄λμ€(Derived Class)μ μλ©Έμ νΈμΆ: κ°μ²΄κ° νκ΄΄λλ μμ μ νμ ν΄λμ€μ μλ©Έμκ° νΈμΆλ©λλ€. μλ©Έμλ ν΄λΉ ν΄λμ€μ κ°μ²΄κ° μλ©Έλ λ νμν μ 리 μμ
μ μνν©λλ€. νμ ν΄λμ€μ μλ©Έμλ νμ ν΄λμ€μ μΆκ°λ λ©€λ² λ³μ λλ μμμ ν΄μ νλ λ±μ μμ
μ μνν μ μμ΅λλ€.
κΈ°λ³Έ ν΄λμ€(Base Class)μ μλ©Έμ νΈμΆ: νμ ν΄λμ€μ μλ©Έμ νΈμΆμ΄ μλ£λλ©΄, κΈ°λ³Έ ν΄λμ€μ μλ©Έμκ° νΈμΆλ©λλ€. κΈ°λ³Έ ν΄λμ€μ μλ©Έμλ ν΄λΉ ν΄λμ€μ κ°μ²΄κ° μλ©Έλ λ νμν μ 리 μμ
μ μνν©λλ€. κΈ°λ³Έ ν΄λμ€μ μλ©Έμλ νμ ν΄λμ€μ μλ©Έμμμ λͺ
μμ μΌλ‘ νΈμΆλμ§ μλλΌλ μλμΌλ‘ νΈμΆλ©λλ€.
μμ κ΄κ³μμ κ°μ²΄μ μλ©Έμ νμ ν΄λμ€μμλΆν° μμνμ¬ κΈ°λ³Έ ν΄λμ€κΉμ§ κ±°μ¬λ¬ μ¬λΌκ°λ©° μλ©Έμκ° νΈμΆλλ λ°λ μμλ‘ μ§νλ©λλ€. μ΄λ₯Ό "μμ μλ©Έ(reverse order of destruction)"μ΄λΌκ³ λ ν©λλ€. μ΄ μμλ κ°μ²΄κ° μμ±λ λμλ λ°λλ‘, κΈ°λ³Έ ν΄λμ€μ μλ©Έμκ° λ¨Όμ νΈμΆλκ³ νμ ν΄λμ€μ μλ©Έμκ° λμ€μ νΈμΆλλ κ²μ
λλ€.
class Base {
private:
int* ptr[64];
public:
Base() {
// κΈ°λ³Έ ν΄λμ€ μμ±μ μ½λ
}
~Base() {
delete ptr[];
// κΈ°λ³Έ ν΄λμ€ μλ©Έμ μ½λ
}
};
class Derived : public Base {
public:
Derived() {
// νμ ν΄λμ€ μμ±μ μ½λ
}
~Derived() {
// νμ ν΄λμ€ μλ©Έμ μ½λ
}
};
μμ μμμμ Derived ν΄λμ€λ Base ν΄λμ€λ₯Ό μμνκ³ μμ΅λλ€. κ°μ²΄κ° μλ©Έλ λλ ~Derived()κ° λ¨Όμ νΈμΆλκ³ , κ·Έ νμ ~Base()κ° νΈμΆλ©λλ€. μ΄λ κ² ν¨μΌλ‘μ¨ νμ ν΄λμ€μ μλ©Έμμμ μΆκ°μ μΈ μ 리 μμ μ μνν ν, κΈ°λ³Έ ν΄λμ€μ μλ©Έμμμ ν΄λΉ ν΄λμ€μ μμμ ν΄μ ν μ μμ΅λλ€.
λ€νμ± κ΄κ³μμμ κ°μ μλ©Έμ(Virtual Destructor)
C++μμ κ°μ μλ©Έμ(virtual destructor)λ κΈ°λ³Έ ν΄λμ€μ λν ν¬μΈν°λ μ°Έμ‘°λ₯Ό μ¬μ©νμ¬ νμ ν΄λμ€ κ°μ²΄λ₯Ό λ€λ£° λ μ€μν μν μ ν©λλ€. νμ ν΄λμ€μ μλ©Έμλ₯Ό κ°μ μλ©Έμλ‘ μ μΈνλ©΄, λμ ν λΉλ κ°μ²΄λ₯Ό μ λλ‘ μλ©Έμν€κ³ λ©λͺ¨λ¦¬ λμ(memory leaks)λ₯Ό λ°©μ§ν μ μμ΅λλ€.
κ°μ ν΄ λ΄
μλ€. κΈ°λ³Έ ν΄λμ€μ λν ν¬μΈν°λ‘ νμ ν΄λμ€ κ°μ²΄λ₯Ό κ°λ¦¬ν€κ³ μλ μν©μμ νμ ν΄λμ€μ κ°μ²΄λ₯Ό μμ νλ €κ³ ν©λλ€. κ·Έλ¬λ κΈ°λ³Έ ν΄λμ€μ μλ©Έμκ° κ°μμ΄ μλ κ²½μ°(κΈ°λ³Έ ν΄λμ€μ μλ©Έμκ° virtualμ΄ μλ κ²½μ°), νμ ν΄λμ€μ μλ©Έμκ° νΈμΆλμ§ μμ μ μμ΅λλ€. μ΄λ νμ ν΄λμ€μ λ©€λ² λ³μ λλ λμ μΌλ‘ ν λΉλ λ©λͺ¨λ¦¬ λ±μ΄ μ μ νκ² ν΄μ λμ§ μλ λ¬Έμ λ₯Ό μ΄λν μ μμ΅λλ€.
λ€μμ virtual μλ©Έμλ₯Ό μ¬μ©νμ§ μμ μμ μ½λμ λλ€.
#include <iostream>
class Base {
public:
Base() {
std::cout << "Base()" << endl;
// κΈ°λ³Έ ν΄λμ€ μμ±μ μ½λ
}
~Base() {
std::cout << "~Base()" << endl;
// κΈ°λ³Έ ν΄λμ€ μλ©Έμ μ½λ
}
};
class Derived : public Base {
public:
Derived() {
std::cout << "Derived()" << endl;
// νμ ν΄λμ€ μμ±μ μ½λ
}
~Derived() {
std::cout << "~Derived()" << endl;
// νμ ν΄λμ€ μλ©Έμ μ½λ
}
};
int main() {
Base* ptr = new Derived();
delete ptr; // λ¬Έμ κ° λ°μν μ μμ
return 0;
}
/* μ€νκ²°κ³Ό
Base()
Derived()
~Base()
*/
μμ μμμμ ptrμ Base ν΄λμ€μ ν¬μΈν°μ§λ§, μ€μ λ‘ Derived ν΄λμ€μ κ°μ²΄λ₯Ό κ°λ¦¬ν€κ³ μμ΅λλ€. κ·Έλ¬λ Base ν΄λμ€μ μλ©Έμκ° κ°μμ΄ μλκΈ° λλ¬Έμ delete ptr λ¬Έμ₯μ΄ μ€νλ λ νμ ν΄λμ€μΈ Derivedμ μλ©Έμκ° νΈμΆλμ§ μμ μ μμ΅λλ€. μ΄λ Derived ν΄λμ€μμ λμ μΌλ‘ ν λΉλ λ©λͺ¨λ¦¬ λλ μΆκ°μ μΈ μ 리 μμ
μ΄ μ λλ‘ μ΄λ£¨μ΄μ§μ§ μλ λ¬Έμ λ₯Ό μ΄λν μ μμ΅λλ€.
λ°λΌμ Base ν΄λμ€μ μλ©Έμμ virtualμ λΆμ¬ κ°μ μλ©Έμλ‘ μ μΈν΄μΌ ν©λλ€:
#include <iostream>
class Base {
public:
Base() {
std::cout << "Base()" << endl;
// κΈ°λ³Έ ν΄λμ€ μμ±μ μ½λ
}
virtual ~Base() {
std::cout << "~Base()" << endl;
// κΈ°λ³Έ ν΄λμ€ μλ©Έμ μ½λ
}
};
class Derived : public Base {
public:
Derived() {
std::cout << "Derived()" << endl;
// νμ ν΄λμ€ μμ±μ μ½λ
}
~Derived() {
std::cout << "~Derived()" << endl;
// νμ ν΄λμ€ μλ©Έμ μ½λ
}
};
int main() {
Base* ptr = new Derived();
delete ptr; // λ¬Έμ κ° λ°μν μ μμ
return 0;
}
/* μ€νκ²°κ³Ό
Base()
Derived()
~Derived()
~Base()
*/
Base ν΄λμ€μ μλ©Έμλ₯Ό virtualλ‘ μ μΈνλ©΄, delete ptr λ¬Έμ₯μ΄ μ€νλ λ Derived ν΄λμ€μ μλ©Έμκ° μ¬λ°λ₯΄κ² νΈμΆλ©λλ€. μ΄λ‘μ¨ Derived ν΄λμ€μμ λμ ν λΉλ λ©λͺ¨λ¦¬ λλ μΆκ°μ μΈ μ 리 μμ μ μ μ νκ² μνν μ μκ² λ©λλ€.
'C++ κΈ°μ΄' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[C++] 18. Standard Library μ 볡νκΈ°(STL) (0) | 2023.08.06 |
---|---|
[C++] 17. μμΈμ²λ¦¬(Exception), std::exception (0) | 2023.07.23 |
[C++] 16-2. λ€νμ±(Polymorphism)κ³Ό μΆμ ν΄λμ€(Abstract Class) (0) | 2023.06.24 |
[C++] 16-1. μμ(Inheritance)κ³Ό κ°μ ν¨μ(Virtual Function) (0) | 2023.06.23 |
[C++] 15. ν΄λμ€(class)μ ꡬ쑰체(struct) (0) | 2023.06.09 |
λκΈ