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) | 동일한 인터페이스로 여러 동작 수행 (오버로딩, 오버라이딩, 가상 함수) |
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 초급 - 8. 객체지향 프로그래밍 (3 - 순수 가상 함수 (= 0)) (0) | 2025.02.22 |
---|---|
C++ 초급 - 8. 객체지향 프로그래밍 (2 - virtual 함수와 오버라이딩 (Overriding)) (0) | 2025.02.22 |
C++ 초급 - 7. 구조체와 클래스 (6 - const 멤버 함수) (0) | 2025.02.22 |
C++ 초급 - 7. 구조체와 클래스 (5 - this 포인터) (0) | 2025.02.22 |
C++ 초급 - 7. 구조체와 클래스 (4 - 접근 지정자 (private, public, protected)) (0) | 2025.02.22 |