μμ κ°μ ν¨μ(Pure Virtual Function)κ³Ό μΆμ ν΄λμ€(Abstract Class)
μμ κ°μ ν¨μ(Pure Virtual Function)λ ν¨μμ μ μλ₯Ό κ°μ§μ§ μκ³ μ μΈλ§ ν¬ν¨νλ κ°μ ν¨μμ
λλ€. μμ κ°μ ν¨μλ = 0μΌλ‘ νμλλ©°, νμ ν΄λμ€μμ λ°λμ ꡬνλμ΄μΌ ν©λλ€. μμ κ°μ ν¨μλ₯Ό κ°μ§ ν΄λμ€λ μΆμ ν΄λμ€λ‘ κ°μ£Όλμ΄ κ°μ²΄λ₯Ό μ§μ μμ±ν μ μμ΅λλ€. μΆμ ν΄λμ€λ μ£Όλ‘ μΈν°νμ΄μ€λ₯Ό μ μνκΈ° μν΄ μ¬μ©λ©λλ€.
μμ κ°μ ν¨μμ μΌλ° κ°μ ν¨μμ μ°¨μ΄μ μ μμ κ°μ ν¨μλ κΈ°λ³Έ ν΄λμ€μμ μ μλ₯Ό κ°μ§μ§ μκ³ , νμ ν΄λμ€μμ ꡬνν΄μΌ νλ€λ μ μ
λλ€. μ΄λ₯Ό ν΅ν΄ λ€νμ±μ μ§μνλ©΄μλ νμ ν΄λμ€μμ κ°κ°μ λ
립μ μΈ λμμ ꡬνν μ μμ΅λλ€.
κ°μ ν¨μμ μμ κ°μ ν¨μλ λ€νμ±μ ꡬννλ λ° μ¬μ©λλ©°, μμ κ³μΈ΅ ꡬ쑰μμ λ€μν κ°μ²΄ νμ
μ μ²λ¦¬νκΈ° μν΄ μ μ©ν©λλ€. μ΄λ₯Ό ν΅ν΄ λ°νμ μμ μ¬λ°λ₯Έ ν¨μκ° νΈμΆλλ©°, κ°μ²΄μ λμμ΄ λμ μΌλ‘ κ²°μ λ μ μμ΅λλ€.
μΆμ ν΄λμ€(Abstract Class)λ νλ μ΄μμ μμ κ°μ ν¨μ(μμ κ°μ λ©€λ² ν¨μ)λ₯Ό ν¬ν¨νλ ν΄λμ€μ
λλ€. μμ κ°μ ν¨μλ ν¨μμ μ μλ₯Ό κ°μ§μ§ μκ³ , μ μΈλ§ ν¬ν¨νλ κ°μ ν¨μμ
λλ€. μΆμ ν΄λμ€λ κ°μ²΄λ₯Ό μ§μ μμ±ν μ μμΌλ©°, νμ ν΄λμ€μμ μ΄λ₯Ό μμλ°μ ꡬ체μ μΈ λμμ ꡬννλ μν μ ν©λλ€.
μΆμ ν΄λμ€λ λ€μκ³Ό κ°μ νΉμ§μ κ°μ§λλ€:
1. μΆμ ν΄λμ€λ νλ μ΄μμ μμ κ°μ ν¨μλ₯Ό ν¬ν¨ν©λλ€. μμ κ°μ ν¨μλ μ μΈλ§ μκ³ μ μκ° μμΌλ©°, "= 0"μΌλ‘ νμλ©λλ€. μ΄λ νμ ν΄λμ€μμ λ°λμ ꡬνλμ΄μΌ ν¨μ λνλ
λλ€.
2. μΆμ ν΄λμ€λ μ§μ κ°μ²΄λ₯Ό μμ±ν μ μμ΅λλ€. μΆμ ν΄λμ€μ μ£Όλ λͺ©μ μ μΈν°νμ΄μ€λ₯Ό μ μνκ³ , νμ ν΄λμ€μμ ν΄λΉ μΈν°νμ΄μ€λ₯Ό ꡬννλ κ²μ
λλ€.
3. μΆμ ν΄λμ€λ μμ κ°μ ν¨μλ₯Ό κ°μ§ μ μλ λ°λ©΄, μΌλ° κ°μ ν¨μλ μΌλ° λ©€λ² ν¨μλ ν¬ν¨ν μ μμ΅λλ€. μΌλ° λ©€λ² ν¨μλ μΆμ ν΄λμ€ λ΄μμ ꡬνλ μ μμ΅λλ€.
μΆμ ν΄λμ€λ λ€νμ±κ³Ό μΆμνλ₯Ό ꡬννλ λ° μ¬μ©λ©λλ€. μΆμ ν΄λμ€λ₯Ό μμλ°μ νμ ν΄λμ€λ μμ κ°μ ν¨μλ₯Ό ꡬνν¨μΌλ‘μ¨ κ³΅ν΅λ μΈν°νμ΄μ€λ₯Ό μ 곡νλ©΄μλ κ°κ°μ λ
립μ μΈ λμμ μνν μ μμ΅λλ€.
#include <iostream>
// μΆμ ν΄λμ€: λν
class Shape {
public:
virtual void draw() const = 0; // μμ κ°μ ν¨μ
virtual double area() const = 0; // μμ κ°μ ν¨μ
void printInfo() const {
std::cout << "μ΄ λνμ λμ΄ " << area() << "λ₯Ό κ°μ§κ³ μμ΅λλ€." << std::endl;
}
};
// νμ ν΄λμ€: μ§μ¬κ°ν
class Rectangle : public Shape {
private:
double width;
double height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
void draw() const override {
std::cout << "μ§μ¬κ°νμ 그립λλ€." << std::endl;
}
double area() const override {
return width * height;
}
};
// νμ ν΄λμ€: μ
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
void draw() const override {
std::cout << "μμ 그립λλ€." << std::endl;
}
double area() const override {
return 3.14 * radius * radius;
}
};
int main() {
// μΆμ ν΄λμ€μ ν¬μΈν°λ₯Ό μ¬μ©νμ¬ κ°μ²΄ λ€νμ± κ΅¬ν
Shape* shape1 = new Rectangle(5, 3);
shape1->draw();
shape1->printInfo();
delete shape1;
Shape* shape2 = new Circle(2.5);
shape2->draw();
shape2->printInfo();
delete shape2;
return 0;
}
/* μ€νκ²°κ³Ό
μ§μ¬κ°νμ 그립λλ€.
μ΄ λνμ λμ΄ 15λ₯Ό κ°μ§κ³ μμ΅λλ€.
μμ 그립λλ€.
μ΄ λνμ λμ΄ 19.625λ₯Ό κ°μ§κ³ μμ΅λλ€.
*/
ShapeλΌλ μΆμ ν΄λμ€λ₯Ό μ μνκ³ , draw()μ area()λΌλ μμ κ°μ ν¨μλ₯Ό μ μΈν©λλ€. λν printInfo()λΌλ μΌλ° λ©€λ² ν¨μλ ν¬ν¨λμ΄ μμ΅λλ€.
Rectangle ν΄λμ€μ Circle ν΄λμ€λ Shape ν΄λμ€λ₯Ό μμλ°μμ κ°κ°μ λνμ ꡬνν©λλ€. μ΄λ€ ν΄λμ€μμλ draw()μ area() ν¨μλ₯Ό μ€λ²λΌμ΄λ©νμ¬ λ
μμ μΈ λμμ ꡬνν©λλ€.
main() ν¨μμμλ Shape ν¬μΈν°λ₯Ό μ¬μ©νμ¬ μΆμ ν΄λμ€μ ν¬μΈν°λ₯Ό μ μΈνκ³ , Rectangleκ³Ό Circle κ°μ²΄λ₯Ό λμ μΌλ‘ μμ±νμ¬ μ΄λ₯Ό κ°λ¦¬ν€κ² ν©λλ€. draw() ν¨μμ printInfo() ν¨μλ₯Ό νΈμΆνμ¬ λνμ μ 보λ₯Ό μΆλ ₯ν ν, λ©λͺ¨λ¦¬λ₯Ό ν΄μ ν©λλ€.
μ΄ μμ μμ μΆμ ν΄λμ€λ μΈν°νμ΄μ€λ₯Ό μ 곡νκ³ , νμ ν΄λμ€μμ μ΄λ₯Ό ꡬ체μ μΌλ‘ ꡬνν¨μΌλ‘μ¨ κ°κ°μ λνμ μ²λ¦¬ν©λλ€. μΆμ ν΄λμ€λ κ°μ²΄λ₯Ό μ§μ μμ±ν μ μμ§λ§, λ€νμ±μ ν΅ν΄ λμΌν μΈν°νμ΄μ€λ₯Ό κ°μ§ κ°μ²΄λ€μ λ€λ£° μ μμ΅λλ€.
λ€νμ±(Polymorphism)
C++μμ λ€νμ±(Polymorphism)μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ μ€μν κ°λ
μ€ νλλ‘, λμΌν μΈν°νμ΄μ€λ₯Ό μ¬μ©νμ¬ λ€μν κ°μ²΄ νμ
μ μ²λ¦¬ν μ μλ λ₯λ ₯μ μλ―Έν©λλ€. λ€νμ±μ μ½λμ μ¬μ¬μ©μ±, μ μ°μ±, νμ₯μ±μ ν₯μμν€λ λκ΅¬λ‘ νμ©λ©λλ€.
C++μμ λ€νμ±μ λ€μκ³Ό κ°μ λ°©λ²μΌλ‘ ꡬνλ©λλ€:
κ°μ ν¨μ(Virtual Function): κΈ°λ³Έ ν΄λμ€μμ κ°μ ν¨μλ₯Ό μ μΈνκ³ , νμ ν΄λμ€μμ μ΄λ₯Ό μ¬μ μ(μ€λ²λΌμ΄λ©)νλ λ°©μμΌλ‘ λ€νμ±μ ꡬνν©λλ€. μ€ν μκ°μ κ°μ²΄μ μ€μ νμ
μ νμ
νμ¬ μ μ ν ν¨μλ₯Ό νΈμΆνλ λμ λ°μΈλ©μ΄ κ°λ₯ν΄μ§λλ€.
μΆμ ν΄λμ€(Abstract Class): μΆμ ν΄λμ€λ μμ κ°μ ν¨μ(μμ κ°μ λ©€λ² ν¨μ)λ₯Ό κ°μ§λ ν΄λμ€λ‘, κ°μ²΄λ₯Ό μ§μ μμ±ν μ μμ΅λλ€. μΆμ ν΄λμ€λ₯Ό μμλ°μ νμ ν΄λμ€μμ μμ κ°μ ν¨μλ₯Ό ꡬνν¨μΌλ‘μ¨ κ°κ°μ λ
립μ μΈ λμμ μνν μ μμ΅λλ€.
κ°μ μλ©Έμ(Virtual Destructor): λ€νμ±μ μ¬μ©ν λλ κΈ°λ³Έ ν΄λμ€μ μλ©Έμλ₯Ό κ°μμΌλ‘ μ μΈν΄μΌ ν©λλ€. μ΄λ νμ ν΄λμ€μ κ°μ²΄λ₯Ό κΈ°λ³Έ ν΄λμ€μ ν¬μΈν°λ‘ μμ ν λ, νμ ν΄λμ€μ μλ©Έμκ° νΈμΆλλλ‘ λ³΄μ₯ν©λλ€.
λ€νμ±μ μ¬μ©νλ©΄ λ€μκ³Ό κ°μ μ΄μ μ μ»μ μ μμ΅λλ€:
μ½λμ μ¬μ¬μ©μ±: λμΌν μΈν°νμ΄μ€λ₯Ό μ¬μ©νμ¬ λ€μν κ°μ²΄λ₯Ό μ²λ¦¬ν μ μμΌλ―λ‘, μ μ¬ν λμμ κ°μ§ κ°μ²΄λ€μ λν΄ μ½λλ₯Ό μ¬μ¬μ©ν μ μμ΅λλ€.
μ μ°μ±κ³Ό νμ₯μ±: μλ‘μ΄ κ°μ²΄ νμ
μ μΆκ°νκ±°λ κΈ°μ‘΄ κ°μ²΄ νμ
μ λ³κ²½νμ¬λ, μ½λμ λ³κ²½μ μ΅μννλ©΄μ λ€νμ±μ νμ©ν μ μμ΅λλ€. μ΄λ νλ‘κ·Έλ¨μ μ μ°μ±κ³Ό νμ₯μ±μ ν₯μμν΅λλ€.
κ°λ
μ±κ³Ό μ μ§ λ³΄μμ±: λ€νμ±μ κ°μ²΄ κ°μ κ΄κ³λ₯Ό λͺ
ννκ² ννν μ μμΌλ©°, μ½λμ κ°λ
μ±κ³Ό μ μ§ λ³΄μμ±μ ν₯μμν΅λλ€. κ°μ²΄μ μ€μ νμ
μ΄ μ€ν μκ°μ κ²°μ λλ―λ‘, μ½λλ₯Ό μ΄ν΄νκ³ μμ νκΈ° μ¬μμ§λλ€.
C++μμ λ€νμ±μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ ν΅μ¬ κ°λ
μ€ νλλ‘, μμ, κ°μ ν¨μ, μΆμ ν΄λμ€ λ±μ νμ©νμ¬ κ΅¬νλ©λλ€. μ΄λ₯Ό ν΅ν΄ μ μ°νκ³ νμ₯ κ°λ₯ν μ½λλ₯Ό μμ±ν μ μμΌλ©°, κ°μ²΄μ λμμ λμ μΌλ‘ κ²°μ ν μ μμ΅λλ€.
#include <iostream>
// μΆμ ν΄λμ€: λν
class Shape {
public:
virtual void draw() const = 0; // μμ κ°μ ν¨μ
virtual double area() const = 0; // μμ κ°μ ν¨μ
};
// νμ ν΄λμ€: μ§μ¬κ°ν
class Rectangle : public Shape {
private:
double width;
double height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
void draw() const override {
std::cout << "μ§μ¬κ°νμ 그립λλ€." << std::endl;
}
double area() const override {
return width * height;
}
};
// νμ ν΄λμ€: μ
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
void draw() const override {
std::cout << "μμ 그립λλ€." << std::endl;
}
double area() const override {
return 3.14 * radius * radius;
}
};
int main() {
// μΆμ ν΄λμ€μ ν¬μΈν°λ₯Ό μ¬μ©νμ¬ λ€μν λν μ²λ¦¬
Shape* shapes[2];
shapes[0] = new Rectangle(8, 5);
shapes[1] = new Circle(3.7);
for (int i = 0; i < 2; i++) {
shapes[i]->draw();
std::cout << "λμ΄: " << shapes[i]->area() << std::endl;
delete shapes[i];
}
return 0;
}
/* μ€νκ²°κ³Ό
μ§μ¬κ°νμ 그립λλ€.
λμ΄: 40
μμ 그립λλ€.
λμ΄: 42.9866
*/
μ΄ μμ λ λ€νμ±μ νμ©νμ¬ μΆμ ν΄λμ€λ₯Ό ν΅ν΄ λνμ λ€μν νμ μ μ²λ¦¬ν μ μλλ‘ κ΅¬νν κ²μ λλ€. Shape ν¬μΈν°λ₯Ό μ¬μ©νλ©΄ μ€ν μκ°μ κ° λνμ μ€μ νμ μ λ§κ² ν¨μκ° νΈμΆλλ©°, κ²°κ³Όμ μΌλ‘ λνμ λμμ΄ λμ μΌλ‘ κ²°μ λ©λλ€.
μΆμ ν΄λμ€μ μμ μ μ μ¬ν©λλ€. λ€λ§ λ€νμ±μ΄λΌλ κ²μ΄ ννκ° λ€μνλ€λ κ²μμ κΈ°λ°ν κ²μ΄λ―λ‘ Shape ν΄λμ€ ννμ λ°°μ΄λ‘ μ μΈ ν ν λΉ λ ꡬν ν΄λμ€λ λ€μνκ² λ³ν μ μμ΅λλ€. μ΄κ²μ΄ λ€νμ±μ ν΅μ¬μ λλ€. λ€νμ±μ κΈ°λ°μΌλ‘ ν λμμΈ ν¨ν΄ μ€μλ ν©ν 리 ν¨ν΄, μΆμ ν©ν 리 ν¨ν΄μ΄ λνμ μ λλ€.
λ€μμ μμ κ΄κ³μμμ μμ±, μλ©Έμ λν΄ μμλ³΄κ² μ΅λλ€.
'C++ κΈ°μ΄' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[C++] 17. μμΈμ²λ¦¬(Exception), std::exception (0) | 2023.07.23 |
---|---|
[C++] 16-3. μμ(Inheritance)κ΄κ³μ μΈμ€ν΄μ€ μμ±, μλ©Έ (0) | 2023.06.29 |
[C++] 16-1. μμ(Inheritance)κ³Ό κ°μ ν¨μ(Virtual Function) (0) | 2023.06.23 |
[C++] 15. ν΄λμ€(class)μ ꡬ쑰체(struct) (0) | 2023.06.09 |
[C++] 14. μ°Έμ‘°μ(Reference) (0) | 2023.06.02 |
λκΈ