AI

추상 클래스(Abstract Class)와 인터페이스 클래스(Interface Class)

Dongjun_ 2025. 5. 15. 10:45

추상 클래스(Abstract Class)와 인터페이스 클래스(Interface Class)에 대한 기초적 고찰

초록(Abstract)

본 논문은 객체지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 개념 중 하나인 추상 클래스(Abstract Class)인터페이스 클래스(Interface Class) 의 개념, 구조, 사용 목적을 설명하고 이 둘의 차이를 비교한다. 개발자가 추상화(abstraction)와 다형성(polymorphism)의 기초를 이해할 수 있도록 실생활의 유사 개념과 C++ 기반의 예시 코드를 통해 설명한다. 또한 다중 상속, 기능 계약, 코드 재사용성 등의 개념을 명확하게 구분하여 실무 적용을 돕는다.


1. 서론(Introduction)

복잡한 소프트웨어 시스템을 설계할 때, 공통된 기능을 분리하고 각 기능을 재사용 가능하게 만드는 설계 방식이 요구된다. 이를 위해 객체지향 프로그래밍(OOP)은 상속(inheritance), 추상화(abstraction), 다형성(polymorphism)과 같은 개념을 제공한다. 본 논문은 그중에서도 추상 클래스인터페이스 클래스라는 개념을 중심으로, 실용적이고 명확한 설명을 제공한다.


2. 추상 클래스(Abstract Class)의 개념

2.1 정의

추상 클래스는 하나 이상의 순수 가상 함수(pure virtual function) 를 포함하고 있는 클래스이다. 순수 가상 함수는 함수의 본체가 없이 선언만 되어 있으며, 이를 상속받은 자식 클래스에서 반드시 구현해야 한다. 추상 클래스는 독립적으로 객체를 생성할 수 없고, 공통된 기능의 상속과 부분 구현을 목적으로 사용된다.

class Animal {
public:
    virtual void makeSound() = 0; // 순수 가상 함수
    virtual void sleep() {
        std::cout << "Animal sleeps..." << std::endl;
    }
};

2.2 특징

  • 객체 생성 불가
  • 일부 함수는 구현 가능
  • 자식 클래스는 반드시 순수 가상 함수를 구현해야 함
  • 단일 상속 또는 다중 상속 가능 (C++ 기준)

2.3 실생활 유추

“Animal(동물)”이라는 개념은 추상적이다. 실제로는 “개(Dog)”, “고양이(Cat)”와 같은 구체적 동물이 존재한다. 모든 동물은 소리를 낼 수 있으나, 어떤 소리를 낼지는 종마다 다르다. 이런 상황을 코드로 표현하기 위해 추상 클래스를 사용한다.


3. 인터페이스 클래스(Interface Class)의 개념

3.1 정의

인터페이스 클래스는 모든 함수가 순수 가상 함수로 이루어진 클래스이며, 어떤 기능이 가능하다는 “계약(contract)”을 표현한다. 구현은 이를 상속받은 클래스에서 담당하며, 공통된 행위의 보장을 목적으로 사용된다.

class IPrintable {
public:
    virtual void print() = 0; // 순수 가상 함수만 존재
};

3.2 특징

  • 모든 메서드는 반드시 하위 클래스에서 구현
  • 다중 상속 용이
  • 상태(state)를 가지지 않음 (보통 멤버 변수 없음)
  • 기능(동작) 정의 중심

3.3 실생활 유추

책, 문서, 사진 등은 모두 “인쇄 가능”하다. 이들 객체는 서로 다른 종류이지만, 공통적으로 “print()”라는 기능을 가지고 있다. IPrintable 인터페이스는 다양한 클래스에서 인쇄 기능을 사용할 수 있도록 명세를 제공한다.


4. 추상 클래스와 인터페이스 클래스의 비교

구분추상 클래스인터페이스 클래스
객체 생성 불가 불가
메서드 구현 포함 일부 가능 불가
다중 상속(C++) 가능하나 충돌 위험 있음 안전한 다중 상속 가능
사용 목적 공통 기능 제공 및 일부 구현 기능 명세와 역할 분리
대표 개념 "무엇이다" (is-a) "무엇을 할 수 있다" (can-do)
예시 Animal (동물) IPrintable (인쇄 가능한 객체)
 

5. 실용적 예시를 통한 구조 확장

// 추상 클래스 사용 예
class Animal {
public:
    virtual void makeSound() = 0;
};

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

// 인터페이스 사용 예
class IWalkable {
public:
    virtual void walk() = 0;
};

class Robot : public IWalkable {
public:
    void walk() override {
        std::cout << "Robot walking..." << std::endl;
    }
};

이처럼 다양한 클래스에 공통된 행위나 개념을 분리하여 구조적으로 설계할 수 있다.


6. 결론(Conclusion)

추상 클래스와 인터페이스 클래스는 객체지향 설계에서 각각 공통 기능의 정의 및 구현 공유, 기능 명세와 역할 분리라는 목적에 따라 사용된다. 이를 구분하여 올바르게 활용할 수 있다면, 유지보수성과 확장성이 뛰어난 소프트웨어를 작성할 수 있다. 개발자는 실생활 개념과 비교하면서 기능과 구조를 이해하는 것이 효과적이며, 이후 다양한 언어의 설계 철학을 비교함으로써 더 넓은 시야를 가질 수 있다.

반응형

'AI' 카테고리의 다른 글

C++ 힙, 해시, 트리 기반의 컨테이너 비교 분석  (0) 2025.05.12