본문 바로가기
c c++ mfc

UML에서 추상 클래스와 인터페이스

by sanglim 2025. 7. 4.
반응형

클래스 다이어그램에서 추상 클래스와 인터페이스의 차이는 객체지향 설계에서 매우 중요한 주제입니다. 아래에서는 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;
}
  1.  공통점
    1. 추상성(Abstractness): 두 개념 모두 추상적인 개념으로, 직접적으로 객체를 생성할 수 없습니다. 인터페이스의 경우 모든 메서드가 추상 메서드이며, 추상 클래스는 추상 메서드를 가질 수 있습니다.
    2. 상속(Inheritance): 둘 다 다른 클래스에서 상속을 받아 사용됩니다. 클래스가 이미 어떤 클래스를 상속하고 있다면, 인터페이스를 구현하거나 추상 클래스를 확장할 수 있습니다.
  2. 차이점
    1. 구현(Implementation)
      1. 인터페이스: 모든 메서드가 추상 메서드이며, 구현을 제공하지 않습니다. 구현 클래스에서 인터페이스의 모든 메서드를 구현해야 합니다.
      2. 추상 클래스: 추상 메서드 뿐만 아니라 일반 메서드도 가질 수 있으며, 추상 메서드의 일부는 구현될 수 있습니다. 따라서 추상 클래스는 일부 구현을 가질 수 있습니다.
    2. 다중 상속(Multiple Inheritance)
      1. 인터페이스: 여러 개의 인터페이스를 구현할 수 있으며, 자바와 같은 언어에서는 다중 상속을 허용합니다.
      2. 추상 클래스: 하나의 클래스만을 상속할 수 있습니다. 다중 상속이 필요한 경우 인터페이스를 사용하는 것이 더 유연합니다.
    3. 생성자(Constructor)
      1. 인터페이스: 생성자를 가질 수 없습니다
      2. 추상 클래스: 생성자를 가질 수 있습니다
    4. 변수(Fields)
      1. 인터페이스: 상수와 추상 메서드만을 가질 수 있습니다
      2. 추상 클래스: 일반 변수, 상수, 메서드 등을 가질 수 있습니다
    5. 사용 용도
      1. 인터페이스: 클래스 간의 계약(Contract)을 정의하고, 다중 상속이 필요한 경우 사용됩니다
      2. 추상 클래스: 공통의 기능을 가지는 클래스들 사이에 코드의 재사용을 위해 사용되며, 다중 상속이 필요하지 않은 경우에 적합합니다

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과 각 언어에서 추상 클래스와 인터페이스는 표기와 사용 목적이 명확히 다르며, 실무에서는 요구 사항에 따라 적절히 선택하는 것이 중요합니다.

반응형