IMCAT.DEV
로그인 가입
C++ 중급 객체지향

C++ 추상 클래스와 인터페이스

C++ 추상 클래스와 인터페이스 — 중급

추상 클래스와 인터페이스

1. 도입 (왜 배워야 하는가)

추상 클래스와 인터페이스는 객체 지향 프로그래밍(OOP)에서 다형성을 지원하는 중요한 개념입니다. 실무에서 이 두 가지를 활용하면 코드의 재사용성을 높이고, 유지보수를 용이하게 하여 개발 효율성을 극대화할 수 있습니다. 만약 이 개념을 모른다면, 다양한 객체를 처리하는 과정에서 코드가 중복되고, 나중에 수정할 때 오류가 발생할 위험이 커집니다. 이는 결국 시간과 비용을 낭비하게 만들 수 있습니다.

2. 핵심 개념 설명

추상 클래스

추상 클래스는 인스턴스를 생성할 수 없는 클래스입니다. 주로 공통적인 속성과 메소드를 정의하고, 이를 상속받은 서브 클래스에서 그 구체적인 구현을 작성합니다. 예를 들어, "동물"이라는 추상 클래스가 있을 때, 이를 상속받아 "개"와 "고양이" 클래스를 구현할 수 있습니다.

인터페이스

인터페이스는 메소드의 시그니처만 정의하고, 구현은 하지 않는 계약입니다. 즉, 인터페이스를 구현하는 클래스는 반드시 그 메소드를 구현해야 합니다. 예를 들어, "비행 가능"이라는 기능을 가진 인터페이스를 만들고, "새"와 "비행기" 클래스가 이를 구현할 수 있습니다.

용어정의
추상 클래스인스턴스를 생성할 수 없는 클래스, 공통 속성과 메소드 정의
인터페이스메소드 시그니처만 정의, 구현은 클래스에서 강제됨

3. 기본 코드 예제

아래는 간단한 추상 클래스와 인터페이스의 사용 예제입니다.

#include <iostream>
using namespace std;

// 추상 클래스
class Animal {
public:
    virtual void makeSound() = 0; // 순수 가상 함수
};

// 고양이 클래스
class Cat : public Animal {
public:
    void makeSound() override { // 메소드 구현
        cout << "Meow" << endl;
    }
};

// 개 클래스
class Dog : public Animal {
public:
    void makeSound() override { // 메소드 구현
        cout << "Bark" << endl;
    }
};

int main() {
    Animal myCat = new Cat(); // Cat 객체 생성
    Animal myDog = new Dog(); // Dog 객체 생성

    myCat->makeSound(); // 고양이 소리 출력
    myDog->makeSound(); // 개 소리 출력

    delete myCat; // 메모리 해제
    delete myDog; // 메모리 해제
    return 0;
}

실행 결과

Meow
Bark

코드 한 줄씩 동작 설명

  1. #include <iostream>: 입출력 라이브러리를 포함합니다.
  2. using namespace std;: std 네임스페이스를 사용합니다.
  3. class Animal {...}: Animal 클래스를 정의합니다.
  4. virtual void makeSound() = 0;: 순수 가상 함수를 선언하여, Animal 클래스를 추상 클래스로 만듭니다.
  5. class Cat : public Animal {...}: Animal 클래스를 상속받아 Cat 클래스를 정의합니다.
  6. void makeSound() override {...}: Cat 클래스에서 makeSound 메소드를 구현합니다.
  7. class Dog : public Animal {...}: Animal 클래스를 상속받아 Dog 클래스를 정의합니다.
  8. int main() {...}: 프로그램의 진입점입니다.
  9. Animal* myCat = new Cat();: Cat 객체를 Animal 타입의 포인터로 생성합니다.
  10. myCat->makeSound();: 고양이 소리를 출력합니다.
  11. delete myCat;: Cat 객체의 메모리를 해제합니다.
  12. 4. 실전 활용 예제

    예제 1: 쇼핑몰에서 장바구니 구현

    장바구니에 담길 수 있는 다양한 상품을 관리하기 위해 추상 클래스를 활용할 수 있습니다. 예를 들어, Product라는 추상 클래스를 만들고, 이를 상속받아 Electronics, Clothing 같은 구체적인 클래스를 구현합니다.

    예제 2: 게임에서 캐릭터 관리

    게임에서 다양한 캐릭터를 관리할 때, Character라는 추상 클래스를 만들고, Warrior, Mage 클래스를 이를 상속받아 각 캐릭터의 고유 행동을 구현합니다. 인터페이스를 사용하면 Attackable 인터페이스를 정의하고 이를 구현하여 공격 가능한 캐릭터를 관리할 수 있습니다.

    5. 흔한 실수와 주의사항

    실수 1: 순수 가상 함수의 구현 생략

    잘못된 코드:

    class Animal {
    public:
        void makeSound() = 0; // 오류 발생
    };

    올바른 코드:

    class Animal {
    public:
        virtual void makeSound() = 0; // 순수 가상 함수로 정의
    };

    실수 2: 인터페이스에서 구현을 시도

    잘못된 코드:

    class IAnimal {
    public:
        void makeSound() { // 오류 발생
            cout << "Sound" << endl;
        }
    };

    올바른 코드:

    class IAnimal {
    public:
        virtual void makeSound() = 0; // 메소드 시그니처만 정의
    };

    6. 정리

    • 추상 클래스는 공통 속성과 메소드를 정의하고, 인스턴스를 생성할 수 없습니다.
    • 인터페이스는 메소드 시그니처만 정의하고, 이를 구현하는 클래스에서 반드시 구현해야 합니다.
    • 이러한 개념은 코드의 재사용성과 유지보수성을 높여줍니다.
    • 다음에 학습하면 좋은 주제: 다형성, 템플릿, 디자인 패턴(특히 전략 패턴과 팩토리 패턴).