반도체/C++

32. C++에서의 객체지향

Clair_de_Lune 2024. 8. 30. 16:57
728x90

C++에서의 객체지향 프로그래밍(OOP, Object-Oriented Programming)은 프로그램을 구성하는 데 있어 객체라는 개념을 중심으로 하는 프로그래밍 패러다임입니다. 

 

 

1. 객체(Object)와 클래스(Class)

  • 객체(Object): 객체는 속성과 행동을 가진 실체를 의미합니다. 예를 들어, "자동차"라는 객체는 색상, 모델, 속도와 같은 속성을 가질 수 있으며, "주행하다", "정지하다"와 같은 행동을 수행할 수 있습니다. 객체는 실제 세계의 개념을 컴퓨터 프로그램으로 모델링하는 데 사용됩니다.
  • 클래스(Class): 클래스는 객체를 생성하기 위한 청사진 또는 템플릿입니다. 클래스는 객체가 가질 속성과 행동을 정의합니다. 즉, 클래스는 객체의 설계도 역할을 하며, 객체는 클래스의 인스턴스(instance)라고 할 수 있습니다. C++에서는 클래스를 정의할 때 class 키워드를 사용합니다.

2. 클래스의 구성 요소

클래스는 주로 다음과 같은 구성 요소로 이루어져 있습니다:

  • 속성(Attributes): 객체가 가지고 있는 데이터 또는 상태를 나타내며, 클래스의 변수로 정의됩니다. 예를 들어, 자동차 클래스에는 color, model, speed와 같은 속성이 있을 수 있습니다.
  • 메서드(Methods): 객체가 수행할 수 있는 행동을 정의하는 함수입니다. 클래스 내부에 정의되며, 객체가 생성된 후 호출할 수 있습니다. 예를 들어, 자동차 클래스에는 drive(), stop()과 같은 메서드가 있을 수 있습니다.

3. 객체지향 프로그래밍의 주요 개념

C++의 객체지향 프로그래밍에는 몇 가지 중요한 개념이 있습니다:

3.1. 캡슐화(Encapsulation)

캡슐화는 데이터와 그 데이터를 조작하는 메서드를 하나의 단위로 묶는 것을 의미합니다. 이를 통해 객체의 내부 상태를 보호하고, 외부에서 직접 접근할 수 없게 하여 데이터 무결성을 유지할 수 있습니다. C++에서는 접근 지정자(access specifier)를 사용하여 캡슐화할 수 있습니다.

  • 공개(public): 클래스 외부에서 접근할 수 있는 멤버입니다.
  • 비공개(private): 클래스 외부에서 접근할 수 없는 멤버입니다.
  • 보호(protected): 클래스 외부에서는 접근할 수 없지만, 하위 클래스에서는 접근할 수 있는 멤버입니다.
class Car {
private:
    int speed; // 비공개 속성

public:
    void setSpeed(int s) { // 공개 메서드
        speed = s;
    }

    int getSpeed() { // 공개 메서드
        return speed;
    }
};

3.2. 상속(Inheritance)

상속은 기존 클래스(부모 클래스 또는 슈퍼 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스 또는 서브 클래스)가 물려받는 것을 의미합니다. 이를 통해 코드의 재사용성과 확장성을 높일 수 있습니다. C++에서는 : 기호를 사용하여 상속을 구현합니다.

class Vehicle {
public:
    void start() {
        std::cout << "차량이 시작되었습니다." << std::endl;
    }
};

class Car : public Vehicle { // Vehicle 클래스를 상속
public:
    void honk() {
        std::cout << "빵빵!" << std::endl;
    }
};

3.3. 다형성(Polymorphism)

다형성은 같은 이름의 메서드가 서로 다른 클래스에서 다르게 동작하는 것을 의미합니다. 다형성은 주로 메서드 오버로딩과 메서드 오버라이딩을 통해 구현됩니다.

  • 메서드 오버로딩(Method Overloading): 같은 이름의 메서드를 여러 개 정의하여 매개변수의 타입이나 개수에 따라 다른 동작을 수행하게 하는 것입니다.
class Printer {
public:
    void print(int i) {
        std::cout << "정수: " << i << std::endl;
    }
    
    void print(double d) {
        std::cout << "실수: " << d << std::endl;
    }
};
  • 메서드 오버라이딩(Method Overriding): 부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의하는 것입니다. 이를 통해 자식 클래스는 부모 클래스의 메서드와 같은 이름의 메서드를 정의할 수 있습니다.
class Animal {
public:
    virtual void sound() { // 가상 메서드
        std::cout << "동물 소리" << std::endl;
    }
};

class Dog : public Animal {
public:
    void sound() override { // 오버라이딩
        std::cout << "멍멍!" << std::endl;
    }
};

4. 객체지향 프로그래밍의 장점

  • 코드 재사용성: 상속을 통해 기존 코드를 재사용할 수 있습니다.
  • 유지보수 용이성: 캡슐화를 통해 코드의 변경이 용이해지고, 데이터 보호가 가능합니다.
  • 유연성: 다형성을 통해 코드의 유연성을 높일 수 있습니다.

5. C++의 객체지향 프로그래밍 예제

마지막으로, 간단한 C++ 프로그램을 통해 객체지향 프로그래밍의 개념을 종합적으로 보여드리겠습니다.

#include <iostream>
#include <string>

// Animal 클래스 정의
class Animal {
public:
    virtual void sound() {
        std::cout << "동물 소리" << std::endl;
    }
};

// Dog 클래스 정의 (Animal 클래스를 상속)
class Dog : public Animal {
public:
    void sound() override {
        std::cout << "멍멍!" << std::endl;
    }
};

// Cat 클래스 정의 (Animal 클래스를 상속)
class Cat : public Animal {
public:
    void sound() override {
        std::cout << "야옹!" << std::endl;
    }
};

int main() {
    Animal* myDog = new Dog(); // Dog 객체 생성
    Animal* myCat = new Cat(); // Cat 객체 생성

    myDog->sound(); // "멍멍!" 출력
    myCat->sound(); // "야옹!" 출력

    delete myDog; // 메모리 해제
    delete myCat; // 메모리 해제
    return 0;
}

Animal 클래스를 부모 클래스로 하고, Dog와 Cat 클래스를 자식 클래스로 정의

728x90