티스토리 뷰
🧠 객체지향 프로그래밍 완벽 이해하기
C++ 코드와 스토리텔링으로 배우는 객체지향의 세계
✅ 객체지향 프로그래밍이란?
🔷 정의
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 현실 세계의 사물(사람, 자동차, 은행 계좌 등)을 ‘객체’라는 단위로 모델링하여, 이 객체들이 서로 데이터와 기능을 함께 가지며 상호작용하는 방식으로 프로그램을 구성하는 패러다임입니다.
간단히 말해,
"현실의 구조를 소프트웨어 안에서 똑같이 표현하고 조작하는 방법"
🔷 필요성
초기 프로그래밍은 절차지향 방식으로, 순서대로 실행되는 함수 중심 구조였습니다.
하지만 프로그램이 커지고, 상태가 많아지고, 역할이 다양해지면서
- 데이터는 여기저기 흩어지고
- 함수는 따로 존재해
- 전체 흐름이 점점 이해하기 어려워지는 문제가 생겼습니다.
이런 복잡한 문제를 더 구조적으로 해결하기 위해 등장한 것이 바로 객체지향입니다.
객체는 데이터와 기능을 하나로 묶고, 여러 객체를 조립해 전체 프로그램을 구성합니다.
✅ 클래스란?
🔷 정의
클래스(Class)는 객체를 만들기 위한 설계도입니다.
속성과 기능을 미리 정의해두고, 이 설계도로부터 원하는 수만큼 객체를 찍어낼 수 있습니다.
"붕어빵 틀이 클래스, 실제 붕어빵이 객체"
🔷 필요성
- 클래스를 사용하면 객체 생성이 일관되고 효율적입니다.
- 복잡한 상태와 동작을 하나의 틀로 묶어 관리할 수 있어, 프로그램의 구조가 더 명확해집니다.
- 유지보수와 확장성에 탁월한 구조를 제공합니다.
✅ 객체지향 vs 절차지향 차이
객체지향이 절차지향보다 왜 나은지 구조적인 비교를 통해 살펴보겠습니다.
다음은 같은 기능(자동차 제어)을 다양한 방식으로 구현한 예입니다.
🧠 객체지향 프로그래밍 완벽 이해하기
C++ 코드와 스토리텔링으로 배우는 객체지향의 세계
✅ 객체지향 프로그래밍이란?
🔷 정의
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 현실 세계의 사물(사람, 자동차, 은행 계좌 등)을 ‘객체’라는 단위로 모델링하여, 이 객체들이 서로 데이터와 기능을 함께 가지며 상호작용하는 방식으로 프로그램을 구성하는 패러다임입니다.
"현실의 구조를 소프트웨어 안에서 똑같이 표현하고 조작하는 방법"
🔷 필요성
- 데이터는 여기저기 흩어지고
- 함수는 따로 존재해
- 전체 흐름이 점점 이해하기 어려워지는 문제가 생김
이런 복잡한 문제를 더 구조적으로 해결하기 위해 등장한 것이 바로 객체지향입니다.
✅ 클래스란?
🔷 정의
클래스(Class)는 객체를 만들기 위한 설계도입니다.
"붕어빵 틀이 클래스, 실제 붕어빵이 객체"
🔷 필요성
- 일관된 객체 생성 가능
- 복잡한 상태와 동작을 틀로 묶음
- 구조 명확, 유지보수 용이
✅ 객체지향 vs 절차지향 차이
📍 [1] 데이터가 흩어진 경우
// 자동차 1대
int car1_speed = 0;
int car1_fuel = 100;
int car1_temperature = 30;
// 자동차 2대
int car2_speed = 0;
int car2_fuel = 80;
int car2_temperature = 40;
📍 [2] 함수가 흩어진 경우
void accelerate(int* speed) {
*speed += 10;
}
void brake(int* speed) {
*speed -= 10;
if (*speed < 0) *speed = 0;
}
📍 [3] 데이터는 묶였지만 함수는 외부
struct CarData {
int speed;
int fuel;
};
void accelerate(CarData* car) {
car->speed += 10;
car->fuel -= 5;
}
📍 [4] 함수는 클래스에 있지만 데이터는 외부
class CarLogic {
public:
static void accelerate(int* speed) {
*speed += 10;
}
static void brake(int* speed) {
*speed -= 10;
if (*speed < 0) *speed = 0;
}
static void refuel(int* fuel) {
*fuel = 100;
}
};
int main() {
int car1_speed = 0;
int car1_fuel = 50;
CarLogic::accelerate(&car1_speed);
CarLogic::refuel(&car1_fuel);
}
📍 [5] 완전한 객체지향 구조
class Car {
private:
int speed;
int fuel;
public:
Car() : speed(0), fuel(100) {}
void accelerate() {
if (fuel <= 0) {
std::cout << "연료 부족으로 가속할 수 없습니다." << std::endl;
return;
}
speed += 10;
fuel -= 5;
std::cout << "속도: " << speed << "km/h, 연료: " << fuel << "%" << std::endl;
}
void brake() {
speed -= 10;
if (speed < 0) speed = 0;
std::cout << "감속 → 속도: " << speed << "km/h" << std::endl;
}
void refuel() {
fuel = 100;
std::cout << "연료를 채웠습니다. (100%)" << std::endl;
}
};
✅ 실제 예시
절차지향 방식
int car1_speed = 0;
int car1_fuel = 100;
accelerate(&car1_speed);
brake(&car1_speed);
객체지향 방식
Car car1;
car1.accelerate();
car1.brake();
car1.refuel();
✅ 최종 요약
✨ 결론
객체지향 프로그래밍은 단순히 객체를 사용하는 것이 아니라,
현실의 구조를 코드 안에 정리해 표현하는 사고방식입니다.
복잡한 시스템일수록 객체지향은 구조적 사고와 관리 용이성을 제공합니다.
'프로그래밍 > 홍정모의 따라배우는 C++' 카테고리의 다른 글
클래스에서 생성자란? (0) | 2025.05.11 |
---|---|
struct와 class의 차이, 접근지정자와 멤버접근함수! (0) | 2025.05.11 |
정적 캐스팅 vs 동적캐스팅 비교, 작동원리(mechanism) (0) | 2025.05.06 |
객체 잘림(Object Slicing)이란? (0) | 2025.05.04 |
다이아몬드 상속 구조의 문제와 가상 상속 (0) | 2025.05.04 |
- Total
- Today
- Yesterday
- 강화학습
- 윤성우
- 일본어
- 류근관
- 일문따
- C
- 오블완
- 파이썬
- stl
- 여인권
- 회계
- 일본어문법무작정따라하기
- 티스토리챌린지
- Python
- C/C++
- 인지부조화
- 통계
- 통계학
- 심리학
- 인프런
- 정보처리기사
- 데이터분석
- 코딩테스트
- 뇌와행동의기초
- 사회심리학
- c++
- 백준
- K-MOOC
- 보세사
- 열혈프로그래밍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |