C++ 초급 - 8. 객체지향 프로그래밍 (1 - 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism))

2025. 2. 22. 14:58프로그래밍 언어/C++

📌 8. 객체지향 프로그래밍 (OOP)

C++은 객체지향 프로그래밍(Object-Oriented Programming, OOP) 언어이며,
캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism)을 기본 개념으로 한다.
또한 가상 함수(Virtual Function), 인터페이스(Interface), C++11의 새로운 기능(override, final, explicit) 등을 포함하여 OOP의 핵심 개념을 학습한다.


📌 8.1 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism)

C++의 객체지향 프로그래밍(OOP)캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism)을 핵심 개념으로 한다.
이러한 개념을 활용하면 코드를 효율적으로 관리하고, 유지보수를 쉽게 할 수 있으며, 확장성을 높일 수 있다.


📌 1. 캡슐화 (Encapsulation)

🔹 (1) 캡슐화란?

  • 캡슐화(Encapsulation)데이터 보호와 정보 은닉을 위한 개념이다.
  • 클래스의 데이터(멤버 변수)를 직접 접근하지 못하도록 보호하고,
    대신 공개된 함수(멤버 함수)를 통해 안전하게 접근하도록 한다.
  • 접근 지정자(private, public, protected)를 활용하여 데이터 보호.

🔹 (2) 정보 은닉과 접근 지정자 활용

접근 지정자 접근 가능 범위 설명
public 클래스 내부 + 외부 어디서든 접근 가능
private 클래스 내부에서만 접근 가능 외부에서는 접근 불가능 (정보 보호)
protected 클래스 내부 + 상속받은 클래스에서 접근 가능 상속 시 자식 클래스에서도 접근 가능

💡 예제: private 멤버 보호 및 public 멤버 함수 사용

#include <iostream>

class BankAccount {
private:
    double balance;  // 외부에서 직접 접근 불가

public:
    BankAccount(double initialBalance) { balance = initialBalance; }

    void deposit(double amount) { balance += amount; }
    void withdraw(double amount) {
        if (amount <= balance) balance -= amount;
        else std::cout << "잔액 부족!" << std::endl;
    }

    double getBalance() const { return balance; }  // private 변수 접근 허용
};

int main() {
    BankAccount account(1000);

    account.deposit(500);
    std::cout << "현재 잔액: " << account.getBalance() << std::endl;  // 1500

    account.withdraw(2000);  // 잔액 부족
    std::cout << "현재 잔액: " << account.getBalance() << std::endl;  // 1500

    return 0;
}

🔹 출력 결과

현재 잔액: 1500
잔액 부족!
현재 잔액: 1500

💡 설명

  • balance는 private → 직접 접근 불가 (account.balance = 1000; ❌).
  • deposit(), withdraw(), getBalance() → ✅ 안전한 접근 방식 제공.

📌 2. 상속 (Inheritance)

🔹 (1) 상속이란?

  • 상속(Inheritance)기존 클래스(부모 클래스, Base Class)의 기능을 확장하여 새로운 클래스(자식 클래스, Derived Class)를 생성하는 기능.
  • 코드 재사용을 극대화하고, 기능 확장이 용이하도록 한다.
  • 상속 시 접근 지정자 (public, protected, private)에 따라 멤버 접근 범위가 다름.

🔹 (2) 기본 상속 구조 및 사용법

상속 타입 설명
public 상속 부모의 public 멤버는 그대로 public, protected 멤버는 그대로 유지
protected 상속 부모의 public과 protected 멤버가 모두 protected가 됨
private 상속 부모의 모든 public 및 protected 멤버가 private로 변환됨

💡 예제: public 상속

#include <iostream>

class Parent {
public:
    void showMessage() { std::cout << "부모 클래스 함수 호출!" << std::endl; }
};

class Child : public Parent {  // public 상속
};

int main() {
    Child obj;
    obj.showMessage();  // ✅ 부모 클래스 함수 호출 가능

    return 0;
}

🔹 출력 결과

부모 클래스 함수 호출!

💡 설명

  • Child 클래스는 Parent를 public으로 상속받아, Parent의 public 멤버를 그대로 사용할 수 있음.

📌 3. 다형성 (Polymorphism)

🔹 (1) 다형성이란?

  • 동일한 함수 이름을 사용하지만, 객체에 따라 다른 동작을 수행하는 개념.
  • 컴파일 시간 다형성(정적 바인딩, Static Binding)런타임 다형성(동적 바인딩, Dynamic Binding)이 있음.

🔹 (2) 함수 오버로딩(Function Overloading)

  • 같은 이름의 함수를 매개변수의 타입이나 개수를 다르게 하여 여러 개 정의하는 것.

💡 예제: 함수 오버로딩

#include <iostream>

class Math {
public:
    int add(int a, int b) { return a + b; }
    double add(double a, double b) { return a + b; }  // 오버로딩
};

int main() {
    Math math;
    std::cout << "정수 덧셈: " << math.add(2, 3) << std::endl;  // 5
    std::cout << "실수 덧셈: " << math.add(2.5, 3.5) << std::endl;  // 6.0

    return 0;
}

🔹 출력 결과

정수 덧셈: 5
실수 덧셈: 6

🔹 (3) 함수 오버라이딩(Function Overriding)과 가상 함수(Virtual Function)

  • 부모 클래스의 함수를 자식 클래스에서 재정의(Override)하는 것.
  • 가상 함수(virtual function)를 사용하면, 객체가 부모 클래스 포인터로 선언되어도 올바른 함수가 호출됨 (동적 바인딩 적용).

💡 예제: 가상 함수와 오버라이딩

#include <iostream>

class Animal {
public:
    virtual void sound() { std::cout << "동물 소리!" << std::endl; }
};

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

int main() {
    Animal* animal = new Dog();  // 부모 클래스 포인터로 자식 객체 생성
    animal->sound();  // ✅ Dog 클래스의 sound()가 호출됨 (동적 바인딩)

    delete animal;
    return 0;
}

🔹 출력 결과

멍멍!

💡 설명

  • virtual 키워드를 사용하면 부모 포인터가 자식 객체를 가리킬 때, 자식 클래스의 오버라이딩된 함수가 호출됨 (다형성 실현).

📌 4. 정리

개념  설명
캡슐화(Encapsulation) 데이터 보호 및 정보 은닉 (private, public, protected)
상속(Inheritance) 부모 클래스의 기능을 자식 클래스가 확장하여 사용 가능
다형성(Polymorphism) 동일한 인터페이스로 여러 동작 수행 (오버로딩, 오버라이딩, 가상 함수)