프로그래밍/C++

[C++] 상속과 다형성: 코드 재사용성과 유연성 극대화하기 🔁

다다면체 2025. 1. 6. 10:00
728x90
반응형

C++의 강력한 기능 중 하나인 상속과 다형성은 코드 재사용성을 높이고, 프로그램을 유연하게 만드는 데 큰 역할을 해요! 오늘은 이 두 가지 개념을 쉽게 이해하고, 실무에서도 바로 적용할 수 있도록 설명해볼게요. 😊 준비되셨나요? 그럼 출발합니다! 🚀


반응형

1. 상속이란 무엇인가요? 🏗️

상속은 기존 클래스(기본 클래스 또는 부모 클래스)의 속성과 동작을 새로운 클래스(파생 클래스 또는 자식 클래스)에 물려주는 것을 의미해요. 이를 통해 중복 코드를 줄이고, 계층적인 설계를 가능하게 만듭니다.

(1) 기본 문법

class 파생클래스 : 접근지정자 부모클래스 형태로 상속을 선언합니다. 📌 예제

class Animal {
public:
    void eat() {
        std::cout << "This animal is eating." << std::endl;
    }
};

class Dog : public Animal {
public:
    void bark() {
        std::cout << "Woof! Woof!" << std::endl;
    }
};

Dog myDog;
myDog.eat(); // 부모 클래스의 기능 사용
myDog.bark(); // 자식 클래스의 고유 기능

(2) 접근 지정자의 역할

상속 시 접근 지정자는 부모 클래스 멤버의 가시성을 결정합니다.

  • public 상속: 부모 클래스의 public, protected 멤버는 그대로 유지됩니다.
  • protected 상속: 부모 클래스의 public 멤버가 protected로 변환됩니다.
  • private 상속: 부모 클래스의 public, protected 멤버가 private로 변환됩니다.

(3) 상속의 장점

  • 코드 재사용성 증가
  • 계층적인 구조 설계 가능
  • 유지보수 용이

2. 다형성이란 무엇인가요? 🎭

다형성은 동일한 인터페이스를 통해 다양한 동작을 수행할 수 있는 능력을 말해요. 특히, 가상 함수와 오버라이딩을 통해 동적 바인딩을 구현할 수 있습니다.

(1) 가상 함수와 오버라이딩

  • 가상 함수는 virtual 키워드를 사용하여 선언하며, 자식 클래스에서 재정의(오버라이딩)할 수 있습니다.
  • 부모 클래스의 포인터나 참조를 통해 자식 클래스의 재정의된 함수를 호출할 수 있어요. 📌 예제
class Shape {
public:
    virtual void draw() {
        std::cout << "Drawing a shape." << std::endl;
    }
};

class Circle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a circle." << std::endl;
    }
};

Shape* shape = new Circle();
shape->draw(); // "Drawing a circle." 출력

(2) 순수 가상 함수와 추상 클래스

  • 순수 가상 함수: 함수 선언 뒤에 = 0을 붙여 정의합니다.
  • 추상 클래스: 하나 이상의 순수 가상 함수를 포함하는 클래스입니다. 직접 객체를 생성할 수 없고, 이를 상속받아 구체화한 클래스만 사용할 수 있어요. 📌 예제
class AbstractShape {
public:
    virtual void draw() = 0; // 순수 가상 함수
};

class Rectangle : public AbstractShape {
public:
    void draw() override {
        std::cout << "Drawing a rectangle." << std::endl;
    }
};

AbstractShape* shape = new Rectangle();
shape->draw(); // "Drawing a rectangle." 출력

3. 다중 상속과 주의점 🛑

다중 상속은 하나의 클래스가 둘 이상의 부모 클래스를 상속받는 것을 말합니다. 그러나 다중 상속은 설계 시 주의가 필요해요.

(1) 다중 상속의 문법

class 파생클래스 : 접근지정자 부모1, 접근지정자 부모2 형태로 선언합니다. 📌 예제

class Animal {
public:
    void eat() {
        std::cout << "This animal is eating." << std::endl;
    }
};

class Bird {
public:
    void fly() {
        std::cout << "This bird is flying." << std::endl;
    }
};

class Bat : public Animal, public Bird {};

Bat myBat;
myBat.eat();
myBat.fly();

(2) 다중 상속의 문제점

  • 다이아몬드 문제: 여러 경로를 통해 동일한 부모 클래스의 멤버를 상속받는 경우, 모호성이 발생할 수 있어요. 📌 해결 방법: 가상 상속 사용
class Animal {
public:
    void eat() {
        std::cout << "This animal is eating." << std::endl;
    }
};

class Mammal : virtual public Animal {};
class Bird : virtual public Animal {};

class Bat : public Mammal, public Bird {};

Bat myBat;
myBat.eat();

4. 핵심과 주의할 점 ⚡

핵심 요약

  1. 상속은 중복 코드를 줄이고, 계층적인 설계를 가능하게 합니다.
  2. 다형성은 동적 바인딩을 통해 유연한 코드를 작성할 수 있습니다.
  3. 가상 함수와 추상 클래스는 다형성을 구현하는 핵심 도구입니다.
  4. 다중 상속은 강력하지만, 설계 시 모호성에 주의해야 합니다.

알고 있으면 좋은 팁

  • Final 키워드: 클래스나 가상 함수 앞에 final을 붙이면 더 이상 상속이나 오버라이딩을 금지할 수 있습니다. 📌 예제
class FinalClass final {};
class Example {
    virtual void func() final {}
};
  • 다형성 활용: 인터페이스 기반 설계를 통해 코드를 확장성과 유지보수성을 높이세요.

5. 마무리 🎉

상속과 다형성은 C++ OOP의 꽃이라고 할 수 있어요. 이를 잘 활용하면 유지보수성과 확장성이 뛰어난 프로그램을 설계할 수 있습니다. 오늘 배운 내용을 토대로 작은 프로젝트를 만들어 직접 적용해 보세요! 다음에는 더 깊은 주제를 다뤄보겠습니다. 😊

728x90
반응형