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
'반도체 > C++' 카테고리의 다른 글
34. 사원관리 프로그램 C++ (0) | 2024.09.03 |
---|---|
33. C++의 GET & SET (1) | 2024.09.03 |
31. C++에서 메모리 관리의 중요성과 힙(heap)과 스택(stack)의 차이 (0) | 2024.08.30 |
30. C++ 스레드 생성 방법 (0) | 2024.08.30 |
29. C++의 스레드 개념 (0) | 2024.08.30 |