λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
C++ 기초

[C++] 16-2. λ‹€ν˜•μ„±(Polymorphism)κ³Ό 좔상 클래슀(Abstract Class)

by μ„œμ•„λž‘πŸ˜ 2023. 6. 24.

 

 

 

순수 가상 ν•¨μˆ˜(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 클래슀 ν˜•νƒœμ˜ λ°°μ—΄λ‘œ μ„ μ–Έ ν›„ ν• λ‹Ή 된 κ΅¬ν˜„ ν΄λž˜μŠ€λŠ” λ‹€μ–‘ν•˜κ²Œ λ³€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이것이 λ‹€ν˜•μ„±μ˜ ν•΅μ‹¬μž…λ‹ˆλ‹€. λ‹€ν˜•μ„±μ„ 기반으둜 ν•œ λ””μžμΈ νŒ¨ν„΄ μ€‘μ—λŠ” νŒ©ν† λ¦¬ νŒ¨ν„΄, 좔상 νŒ©ν† λ¦¬ νŒ¨ν„΄μ΄ λŒ€ν‘œμ μž…λ‹ˆλ‹€.

 

λ‹€μŒμ€ 상속 κ΄€κ³„μ—μ„œμ˜ 생성, μ†Œλ©Έμ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.



λŒ“κΈ€