반응형
클래스 다이어그램에서 추상 클래스와 인터페이스의 차이는 객체지향 설계에서 매우 중요한 주제입니다. 아래에서는 UML 표기법, 언어별 매핑, 그리고 실무 적용 기준을 중심으로 정리합니다.

1. 추상클래스와 인터페이스의 공통점과 차이점
#include <iostream>
using namespace std;
// 인터페이스 역할을 하는 클래스
class Pet {
public:
virtual void play() = 0; // 순수 가상 함수 → 구현 없음
virtual ~Pet() {} // 가상 소멸자 (인터페이스에서는 권장)
};
// Animal은 추상 클래스
class Animal {
public:
virtual void makeSound() = 0; // 추상 메서드
void eat() {
cout << "Eating..." << endl;
}
void sleep() {
cout << "Sleeping..." << endl;
}
virtual ~Animal() {}
};
// Dog는 Animal을 상속하고 Pet 인터페이스도 구현
class Dog : public Animal, public Pet {
public:
void makeSound() override {
cout << "Woof!" << endl;
}
void play() override {
cout << "Dog is playing fetch!" << endl;
}
};
// Cat은 Animal만 상속
class Cat : public Animal {
public:
void makeSound() override {
cout << "Meow!" << endl;
}
};
int main() {
Dog myDog;
Cat myCat;
myDog.eat();
myDog.makeSound();
myDog.play();
myCat.sleep();
myCat.makeSound();
return 0;
}
- 공통점
- 추상성(Abstractness): 두 개념 모두 추상적인 개념으로, 직접적으로 객체를 생성할 수 없습니다. 인터페이스의 경우 모든 메서드가 추상 메서드이며, 추상 클래스는 추상 메서드를 가질 수 있습니다.
- 상속(Inheritance): 둘 다 다른 클래스에서 상속을 받아 사용됩니다. 클래스가 이미 어떤 클래스를 상속하고 있다면, 인터페이스를 구현하거나 추상 클래스를 확장할 수 있습니다.
- 차이점
- 구현(Implementation)
- 인터페이스: 모든 메서드가 추상 메서드이며, 구현을 제공하지 않습니다. 구현 클래스에서 인터페이스의 모든 메서드를 구현해야 합니다.
- 추상 클래스: 추상 메서드 뿐만 아니라 일반 메서드도 가질 수 있으며, 추상 메서드의 일부는 구현될 수 있습니다. 따라서 추상 클래스는 일부 구현을 가질 수 있습니다.
- 다중 상속(Multiple Inheritance)
- 인터페이스: 여러 개의 인터페이스를 구현할 수 있으며, 자바와 같은 언어에서는 다중 상속을 허용합니다.
- 추상 클래스: 하나의 클래스만을 상속할 수 있습니다. 다중 상속이 필요한 경우 인터페이스를 사용하는 것이 더 유연합니다.
- 생성자(Constructor)
- 인터페이스: 생성자를 가질 수 없습니다
- 추상 클래스: 생성자를 가질 수 있습니다
- 변수(Fields)
- 인터페이스: 상수와 추상 메서드만을 가질 수 있습니다
- 추상 클래스: 일반 변수, 상수, 메서드 등을 가질 수 있습니다
- 사용 용도
- 인터페이스: 클래스 간의 계약(Contract)을 정의하고, 다중 상속이 필요한 경우 사용됩니다
- 추상 클래스: 공통의 기능을 가지는 클래스들 사이에 코드의 재사용을 위해 사용되며, 다중 상속이 필요하지 않은 경우에 적합합니다
- 구현(Implementation)
2. UML에서 추상 클래스와 인터페이스 표현 방법
- 추상 클래스
- 이탤릭체(기울임꼴)로 클래스명과 추상 메서드를 표기합니다.
- 또는 클래스 구획에 {abstract} 프로퍼티를 명시할 수 있습니다
- 일반 클래스와 동일한 사각형 기호를 사용하되, 이름이나 메서드가 이탤릭체로 표시됩니다.
- 인터페이스
- 클래스 기호(사각형)에 <<interface>> 스테레오타입을 클래스명 위에 붙입니다
- 또는 별도의 인터페이스 기호(원형)에 이름을 표기하기도 합니다.
- 인터페이스와 이를 구현(Realization)하는 클래스 사이의 관계는 점선+빈 삼각형 화살표로 표현합니다
3. 자바, C++, C# 등 언어별 매핑 예시
| 구분 | Java | C++ | C# |
| 추상 클래스 | abstract class Shape { ... } | class Shape { virtual void draw() = 0; } | abstract class Shape { ... } |
| 인터페이스 | interface Drawable { ... } | class Drawable { virtual void draw() = 0; } | interface IDrawable { ... } |
| 구현 방식 | implements 키워드로 구현 | 다중 상속으로 인터페이스 역할 수행 | : 뒤에 인터페이스명 나열 |
| 다중 상속 | 클래스는 불가, 인터페이스는 다중 구현 | 클래스/인터페이스 모두 다중 상속 가능 | 클래스는 불가, 인터페이스는 다중 구현 |
- Java
- 추상 클래스: abstract class 선언, 추상 메서드는 abstract로 명시.
- 인터페이스: interface 선언, 모든 메서드는 기본적으로 추상.
- 클래스는 하나만 상속, 인터페이스는 여러 개 구현 가능
- C++
- 추상 클래스: 하나 이상의 순수 가상 함수(= 0)를 가진 클래스
- 인터페이스: 모든 메서드가 순수 가상 함수인 추상 클래스로 구현.
- 다중 상속 지원, 인터페이스 역할을 추상 클래스로 대체
- C#
- 추상 클래스: abstract class로 선언, 추상 메서드는 abstract로 명시.
- 인터페이스: interface로 선언, 메서드 구현 없이 시그니처만 명시
- 클래스는 하나만 상속, 인터페이스는 여러 개 구현 가능.
4. 실무에서 추상 클래스와 인터페이스 사용 기준
- 추상 클래스
- 공통된 기본 구현(상태, 메서드 등)이 필요할 때 사용합니다.
- 여러 하위 클래스가 공유할 수 있는 코드(멤버 변수, 일부 메서드 구현 등)가 있을 때 적합합니다.
- 단일 상속만 가능(자바, C# 기준).
- 예시: 동물의 공통 동작(먹기, 자기 등)과 상태(나이, 이름 등)를 정의하는 Animal 추상 클래스
- 인터페이스
- 구현 강제만 필요하고, 코드 상속(구현/상태)이 필요 없을 때 사용합니다.
- 다양한 클래스에 동일한 동작(메서드 시그니처)만을 강제하고 싶을 때 적합합니다.
- 다중 구현이 가능하며, 여러 인터페이스를 동시에 구현할 수 있습니다.
- 예시: Drawable, Serializable 등 특정 기능을 보장해야 할 때
실무 적용 기준 요약
- 공통 코드, 상태, 일부 구현이 필요하면 추상 클래스
- 여러 타입에 동일한 동작(계약)만 강제하고 싶으면 인터페이스
참고: UML 표기 예시
- 위 코드를 그린 Class Diagram입니다.
-

이처럼 UML과 각 언어에서 추상 클래스와 인터페이스는 표기와 사용 목적이 명확히 다르며, 실무에서는 요구 사항에 따라 적절히 선택하는 것이 중요합니다.
반응형
'c c++ mfc' 카테고리의 다른 글
| 디자인패턴 - 프로토타입(Prototype) (0) | 2025.03.20 |
|---|---|
| 디자인패턴 - 팩토리 메소드(Factory Method) (0) | 2025.03.17 |
| 디자인패턴 - 빌더 패턴(Builder Pattern) (0) | 2025.03.17 |
| 디자인패턴 - 추상 팩토리 패턴(Abstract Factory Pattern) (0) | 2025.03.17 |
| Visual Studio 재배포 패키지가 설치되지 않는 문제 해결방법 (2) | 2024.10.11 |