학습
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
코드 한 줄씩 동작 설명
#include <iostream>: 입출력 라이브러리를 포함합니다.using namespace std;: std 네임스페이스를 사용합니다.class Animal {...}: Animal 클래스를 정의합니다.virtual void makeSound() = 0;: 순수 가상 함수를 선언하여, Animal 클래스를 추상 클래스로 만듭니다.class Cat : public Animal {...}: Animal 클래스를 상속받아 Cat 클래스를 정의합니다.void makeSound() override {...}: Cat 클래스에서 makeSound 메소드를 구현합니다.class Dog : public Animal {...}: Animal 클래스를 상속받아 Dog 클래스를 정의합니다.int main() {...}: 프로그램의 진입점입니다.Animal* myCat = new Cat();: Cat 객체를 Animal 타입의 포인터로 생성합니다.myCat->makeSound();: 고양이 소리를 출력합니다.delete myCat;: Cat 객체의 메모리를 해제합니다.- 추상 클래스는 공통 속성과 메소드를 정의하고, 인스턴스를 생성할 수 없습니다.
- 인터페이스는 메소드 시그니처만 정의하고, 이를 구현하는 클래스에서 반드시 구현해야 합니다.
- 이러한 개념은 코드의 재사용성과 유지보수성을 높여줍니다.
- 다음에 학습하면 좋은 주제: 다형성, 템플릿, 디자인 패턴(특히 전략 패턴과 팩토리 패턴).
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; // 메소드 시그니처만 정의
};