Programming/객체지향프로그래밍

객체지향프로그래밍 - 추상화와 OOP 3요소와의 관계

moxie2ks 2025. 1. 24. 18:01
728x90
반응형

개요

객체지향 프로그래밍에서 추상화(Abstraction)는 OOP의 핵심 개념이지만, 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism)이라는 "3요소"로 따로 분리되어 언급되지는 않는다. 그러나 추상화는 3요소에 깊이 관여하는 개념으로, 특정 요소에 포함되거나, 독립적인 개념으로 이해될 수 있다.

추상화와 캡슐화의 관계

  • 추상화는 무엇을 해야 하는지에 초점을 맞추는 반면, 캡슐화는 어떻게 할 것인지에 초점을 맞춘다.
  • 예를 들어, 추상 클래스나 인터페이스를 사용하여 "행동의 골격(what to do)"을 정의한 다음, 세부 구현은 감추는 캡슐화를 통해 내부적으로 처리한다.

추상화와 상속의 관계

  • 상속은 추상화를 실현하기 위한 도구로 사용된다.
  • 부모 클래스는 공통적인 특징과 동작을 정의(추상화)하고, 자식 클래스는 이를 상속받아 구체화한다.

추상화와 다형성의 관계

  • 추상화는 다형성을 가능하게 하는 기반이다.
  • 추상 클래스를 통해 여러 클래스가 공통된 인터페이스를 공유하며, 다형성을 통해 런타임에 서로 다른 동작을 수행한다.

예시

추상 클래스 Animal은 "소리를 낸다"는 공통된 행동을 정의(추상화)했다.

이를 상속받아 DogCat과 같은 다형의 클래스가 형성되고, 각 클래스는 구체적인 구현을 제공한다.

#include <iostream>
using namespace std;

// 추상화: 동물의 공통된 행동 정의 (무엇을 해야 하는가)
class Animal {
public:
    virtual void makeSound() const = 0; // 순수 가상 함수
};

// 구체화: 세부 동작 정의 (어떻게 할 것인가)
class Dog : public Animal { //자식 클래스 Dog가 Animal을 상속받아 구체화
public:
    void makeSound() const override {
        cout << "Woof!" << endl;
    }
};

// 구체화: 세부 동작 정의 (어떻게 할 것인가)
class Cat : public Animal { //자식 클래스 Cat이 Animal을 상속받아 구체화
public:
    void makeSound() const override {
        cout << "Meow!" << endl;
    }
};

int main() {
        // 추상클래스 Animal을 통해 Dog, Cat 클래스로 다양하게 형성
    Animal* animal1 = new Dog();
    Animal* animal2 = new Cat();

    animal1->makeSound(); // Dog의 구현
    animal2->makeSound(); // Cat의 구현

    delete animal1;
    delete animal2;

    return 0;
}

결론

  • 추상화는 3요소에 내재된 개념으로, 캡슐화, 상속, 다형성을 구현하는 데 필수적인 기반이다.
  • 따라서 OOP의 "4번째 요소"로 보기보다는, OOP의 3요소에 전반적으로 스며 있는 개념으로 이해하는 것이 적합하다.
  • 추상 클래스, 인터페이스, 가상 함수 등은 추상화를 구체화하는 도구로서 다른 요소들과 자연스럽게 통합된다.

참고 문헌

객체지향 프로그래밍의 3요소 5원칙

객체지향프로그래밍이란? 3요소 | 5원칙 | 그리고 추상화

728x90
반응형