c++

C++ 객체 지향 프로그래밍 (OOP) 시작하기

난개발자 2025. 2. 1. 16:23
728x90

C++는 **객체 지향 프로그래밍(Object-Oriented Programming, OOP)**의 강력한 기능을 제공하는 언어입니다. 객체 지향 프로그래밍은 코드를 더 효율적이고 유지보수하기 쉽게 만들어 주는 프로그래밍 패러다임으로, 클래스객체를 기반으로 합니다.

이번 글에서는 C++에서 객체 지향 프로그래밍의 기초 개념을 소개하고, 클래스객체의 개념, 그리고 이를 어떻게 사용하는지에 대해 알아보겠습니다.


1. 객체 지향 프로그래밍(OOP)란?

객체 지향 프로그래밍은 **현실 세계의 사물(객체)**을 프로그래밍으로 모델링하는 방법입니다.

OOP의 4대 원칙:

  1. 캡슐화(Encapsulation): 데이터를 보호하고 숨기는 것. 객체의 내부 구현을 외부에 노출하지 않습니다.
  2. 상속(Inheritance): 기존 클래스를 기반으로 새로운 클래스를 만드는 것.
  3. 다형성(Polymorphism): 같은 인터페이스로 다양한 형태의 동작을 구현하는 것.
  4. 추상화(Abstraction): 불필요한 정보를 숨기고 필요한 정보만 보여주는 것.

C++는 이 모든 개념을 지원하는 강력한 객체 지향 언어입니다.


2. 클래스와 객체

(1) 클래스란?

클래스는 **데이터(속성)**와 **함수(메서드)**를 하나로 묶은 사용자 정의 데이터 타입입니다.

(2) 객체란?

객체는 클래스로부터 생성된 실제 인스턴스입니다. 클래스는 설계도, 객체는 그 설계도로 만든 제품이라고 할 수 있습니다.


3. 클래스 작성하기

(1) 기본 클래스 구조

#include <iostream>
using namespace std;

// 클래스 정의
class Car {
public:
    // 속성 (멤버 변수)
    string brand;
    string model;
    int year;

    // 메서드 (멤버 함수)
    void displayInfo() {
        cout << "브랜드: " << brand << endl;
        cout << "모델: " << model << endl;
        cout << "연식: " << year << endl;
    }
};

int main() {
    // 객체 생성
    Car myCar;
    myCar.brand = "Hyundai";
    myCar.model = "Sonata";
    myCar.year = 2022;

    // 메서드 호출
    myCar.displayInfo();

    return 0;
}

(2) 출력 결과:

브랜드: Hyundai
모델: Sonata
연식: 2022

4. 생성자와 소멸자

(1) 생성자(Constructor)

  • 생성자는 객체가 생성될 때 자동으로 호출되는 특별한 함수입니다.
  • 객체의 초기화를 담당합니다.
class Car {
public:
    string brand;
    string model;
    int year;

    // 생성자 정의
    Car(string b, string m, int y) {
        brand = b;
        model = m;
        year = y;
    }

    void displayInfo() {
        cout << "브랜드: " << brand << ", 모델: " << model << ", 연식: " << year << endl;
    }
};

int main() {
    Car myCar("Kia", "K5", 2021);
    myCar.displayInfo();
    return 0;
}

(2) 소멸자(Destructor)

  • 소멸자는 객체가 소멸될 때 자동으로 호출되는 함수입니다.
  • 주로 메모리 해제리소스 반환을 담당합니다.
class Car {
public:
    string brand;

    // 생성자
    Car(string b) {
        brand = b;
        cout << brand << " 자동차가 생성되었습니다." << endl;
    }

    // 소멸자
    ~Car() {
        cout << brand << " 자동차가 소멸되었습니다." << endl;
    }
};

int main() {
    Car myCar("Genesis");
    return 0;
}

(3) 출력 결과:

Genesis 자동차가 생성되었습니다.
Genesis 자동차가 소멸되었습니다.

5. 접근 지정자 (Access Specifiers)

(1) 접근 지정자의 종류

  1. public: 어디서나 접근 가능
  2. private: 클래스 내부에서만 접근 가능 (외부에서는 접근 불가)
  3. protected: 클래스 내부와 상속받은 클래스에서만 접근 가능

(2) 예제: 캡슐화 활용하기

class Account {
private:
    int balance;  // private으로 외부 접근 금지

public:
    // 생성자
    Account(int initial_balance) {
        balance = initial_balance;
    }

    // balance에 접근하기 위한 메서드 (Getter)
    int getBalance() {
        return balance;
    }

    // balance를 수정하기 위한 메서드 (Setter)
    void deposit(int amount) {
        if (amount > 0) balance += amount;
    }
};

int main() {
    Account myAccount(1000);
    myAccount.deposit(500);
    cout << "잔액: " << myAccount.getBalance() << endl;  // 잔액: 1500
    return 0;
}
728x90