티스토리 뷰

반응형
객체지향 프로그래밍 완벽 이해하기

🧠 객체지향 프로그래밍 완벽 이해하기

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();



반응형

 


✅ 최종 요약

항목 절차지향 객체지향
구조 데이터와 함수가 분리됨 객체 내부에 통합
상태 추적 변수 폭발 객체별 상태 유지
의미 표현 불명확 의미와 동작을 객체로 표현
확장성 낮음 높음
현실 모델링 어려움 직관적



✨ 결론

객체지향 프로그래밍은 단순히 객체를 사용하는 것이 아니라,
현실의 구조를 코드 안에 정리해 표현하는 사고방식입니다.

복잡한 시스템일수록 객체지향은 구조적 사고관리 용이성을 제공합니다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함
반응형