C++의 핵심인 객체 지향 프로그래밍(OOP)은 효율적이고 확장 가능한 코드를 작성하는 데 필수적인 패러다임이에요! 오늘은 클래스와 객체를 중심으로 OOP의 기본 개념부터 활용법까지 알아볼 거예요. 🚀 준비되셨나요? 그럼 시작합니다!
1. 클래스와 객체란? 🤔
클래스는 객체를 정의하는 청사진(템플릿)이며, 객체는 클래스에서 생성된 실체입니다. 클래스와 객체를 이해하면 데이터와 함수를 하나로 묶어 더 체계적인 프로그램을 설계할 수 있어요.
(1) 클래스 정의하기
클래스는 class 키워드를 사용해 정의합니다. 클래스 내부에는 멤버 변수와 멤버 함수가 포함됩니다. 📌 예제
class Car {
public:
std::string brand;
int speed;
void displayInfo() {
std::cout << "Brand: " << brand << ", Speed: " << speed << " km/h" << std::endl;
}
};
(2) 객체 생성
클래스는 객체를 생성해야 실제 데이터를 다룰 수 있습니다. 📌 예제
Car myCar;
myCar.brand = "Tesla";
myCar.speed = 200;
myCar.displayInfo(); // Brand: Tesla, Speed: 200 km/h
2. 접근 지정자: public, private, protected 🛡️
C++에서 멤버의 접근 권한을 설정하려면 접근 지정자를 사용해야 합니다. 접근 지정자는 클래스의 캡슐화를 돕습니다.
(1) public
public 멤버는 클래스 외부에서 접근할 수 있습니다. 📌 예제
class Example {
public:
int data;
};
Example obj;
obj.data = 10; // 가능
(2) private
private 멤버는 클래스 내부에서만 접근할 수 있습니다. 📌 예제
class Example {
private:
int data;
public:
void setData(int value) {
data = value;
}
int getData() {
return data;
}
};
Example obj;
obj.setData(10);
std::cout << obj.getData(); // 10
(3) protected
protected 멤버는 파생 클래스에서 접근할 수 있습니다. 주로 상속에서 활용됩니다.
3. 생성자와 소멸자 사용법 🛠️
생성자와 소멸자는 객체의 생애주기 동안 초기화와 정리를 담당하는 특별한 함수입니다.
(1) 생성자(Constructor)
생성자는 클래스 이름과 동일하며, 객체가 생성될 때 자동으로 호출됩니다. 📌 예제
class Car {
public:
std::string brand;
int speed;
Car(std::string b, int s) {
brand = b;
speed = s;
}
void displayInfo() {
std::cout << "Brand: " << brand << ", Speed: " << speed << " km/h" << std::endl;
}
};
Car myCar("Tesla", 200);
myCar.displayInfo(); // Brand: Tesla, Speed: 200 km/h
(2) 소멸자(Destructor)
소멸자는 객체가 삭제되거나 범위를 벗어날 때 호출됩니다. 메모리 정리에 사용되며 ~를 클래스 이름 앞에 붙여 정의합니다. 📌 예제
class Example {
public:
~Example() {
std::cout << "소멸자가 호출되었습니다!" << std::endl;
}
};
Example obj; // 범위를 벗어나면 소멸자가 호출됩니다.
4. 객체 지향 프로그래밍의 핵심 원칙 🌟
OOP는 다음 네 가지 원칙을 기반으로 합니다:
(1) 캡슐화 (Encapsulation)
데이터와 함수를 하나의 클래스로 묶어 외부로부터 숨깁니다. 이를 통해 데이터 무결성을 유지할 수 있습니다.
(2) 상속 (Inheritance)
기존 클래스의 속성과 동작을 재사용하며, 새로운 클래스를 확장할 수 있습니다. 📌 예제
class Vehicle {
public:
int wheels;
void displayWheels() {
std::cout << "Wheels: " << wheels << std::endl;
}
};
class Car : public Vehicle {
public:
std::string brand;
};
Car myCar;
myCar.wheels = 4;
myCar.brand = "BMW";
myCar.displayWheels(); // Wheels: 4
(3) 다형성 (Polymorphism)
동일한 함수 이름이 다양한 동작을 수행할 수 있도록 합니다. 이는 오버로딩과 오버라이딩으로 구현됩니다. 📌 예제
class Shape {
public:
virtual void draw() {
std::cout << "Drawing Shape" << std::endl;
}
};
class Circle : public Shape {
public:
void draw() override {
std::cout << "Drawing Circle" << std::endl;
}
};
Shape* shape = new Circle();
shape->draw(); // Drawing Circle
(4) 추상화 (Abstraction)
복잡한 내부 구현을 숨기고 필요한 기능만 외부에 제공합니다. 이는 순수 가상 함수와 인터페이스를 통해 구현됩니다.
5. 마무리 🎉
클래스와 객체는 C++의 강력한 도구로, OOP의 시작점이자 핵심이에요. 캡슐화, 상속, 다형성, 추상화를 이해하고 적용하면 유지보수성과 확장성이 뛰어난 프로그램을 작성할 수 있습니다. 꾸준히 연습하며 이 개념들을 자신의 코드에 통합해 보세요! 다음에는 더 고급 주제를 다뤄보겠습니다. 😊
'C++' 카테고리의 다른 글
[C++] STL 활용법: 벡터, 리스트, 맵으로 데이터 다루기 💡 (0) | 2025.01.06 |
---|---|
[C++] 상속과 다형성: 코드 재사용성과 유연성 극대화하기 🔁 (0) | 2025.01.06 |
[C++] 배열과 포인터 완벽 이해하기: 차이점과 사용법 🔍 (0) | 2025.01.06 |
[C++] 함수 완전 가이드: 선언, 정의, 호출까지 📚 (0) | 2025.01.05 |
[C++] 프로그램 흐름 제어: 조건문과 반복문 제대로 쓰기 🔄 (0) | 2025.01.04 |