C++ 학습: 객체 지향 프로그래밍
C++는 객체 지향 프로그래밍(OOP)의 강력한 기능을 제공하여 코드의 재사용성과 유연성을 높입니다. 이번 글에서는 상속, 다형성, 연산자 오버로딩, 그리고 템플릿에 대해 알아보겠습니다.
1. 상속: 클래스 상속, 다중 상속
상속은 기존 클래스를 기반으로 새로운 클래스를 정의하는 기능입니다. 상속을 통해 코드의 재사용성을 높이고, 클래스 간의 계층 구조를 정의할 수 있습니다.
클래스 상속
using namespace std;
// 기본 클래스 (Base class)
class Animal {
public:
void eat() {
cout << "Eating..." << endl;
}
};
// 파생 클래스 (Derived class)
class Dog : public Animal {
public:
void bark() {
cout << "Barking..." << endl;
}
};
int main() {
Dog dog;
dog.eat(); // 상속받은 함수 호출
dog.bark();
return 0;
}
위의 예제에서 Dog 클래스는 Animal 클래스를 상속받아 eat 함수를 사용할 수 있습니다.
다중 상속
C++에서는 하나의 클래스가 둘 이상의 클래스를 상속받을 수 있습니다. 이를 다중 상속이라고 합니다.
using namespace std;
class Animal {
public:
void eat() {
cout << "Eating..." << endl;
}
};
class Pet {
public:
void play() {
cout << "Playing..." << endl;
}
};
class Dog : public Animal, public Pet {
public:
void bark() {
cout << "Barking..." << endl;
}
};
int main() {
Dog dog;
dog.eat(); // Animal 클래스에서 상속받은 함수
dog.play(); // Pet 클래스에서 상속받은 함수
dog.bark();
return 0;
}
위의 예제에서 Dog 클래스는 Animal 클래스와 Pet 클래스를 모두 상속받아 eat과 play 함수를 사용할 수 있습니다.
2. 다형성: 가상 함수와 추상 클래스
다형성은 하나의 인터페이스로 여러 유형의 객체를 처리할 수 있게 하는 기능입니다. C++에서는 가상 함수와 추상 클래스를 통해 다형성을 구현할 수 있습니다.
가상 함수
가상 함수는 파생 클래스에서 재정의할 수 있는 기본 클래스의 함수입니다. 이를 통해 런타임에 올바른 함수가 호출되도록 할 수 있습니다.
using namespace std;
class Animal {
public:
virtual void sound() {
cout << "Some generic animal sound" << endl;
}
};
class Dog : public Animal {
public:
void sound() override {
cout << "Bark" << endl;
}
};
class Cat : public Animal {
public:
void sound() override {
cout << "Meow" << endl;
}
};
int main() {
Animal* animal;
Dog dog;
Cat cat;
animal = &dog;
animal->sound(); // Bark
animal = &cat;
animal->sound(); // Meow
return 0;
}
위의 예제에서 Animal 클래스의 sound 함수는 가상 함수로 선언되었으며, Dog와 Cat 클래스에서 재정의되었습니다.
추상 클래스
추상 클래스는 하나 이상의 순수 가상 함수를 포함하는 클래스입니다. 순수 가상 함수는 함수 선언만 있고 정의는 없는 함수입니다.
using namespace std;
class Shape {
public:
virtual void draw() = 0; // 순수 가상 함수
};
class Circle : public Shape {
public:
void draw() override {
cout << "Drawing Circle" << endl;
}
};
class Square : public Shape {
public:
void draw() override {
cout << "Drawing Square" << endl;
}
};
int main() {
Shape* shape;
Circle circle;
Square square;
shape = &circle;
shape->draw(); // Drawing Circle
shape = □
shape->draw(); // Drawing Square
return 0;
}
위의 예제에서 Shape 클래스는 추상 클래스이며, draw 함수는 순수 가상 함수로 선언되었습니다. Circle과 Square 클래스에서 이를 재정의합니다.
3. 연산자 오버로딩: 연산자 오버로딩의 개념과 사용
연산자 오버로딩은 사용자 정의 클래스에서 기존 연산자를 재정의하여 사용할 수 있는 기능입니다. 이를 통해 클래스 객체 간의 연산을 자연스럽게 수행할 수 있습니다.
연산자 오버로딩 예제
using namespace std;
class Complex {
private:
float real;
float imag;
public:
Complex() : real(0), imag(0) {}
Complex(float r, float i) : real(r), imag(i) {}
// 연산자 오버로딩
Complex operator + (const Complex& obj) {
Complex temp;
temp.real = real + obj.real;
temp.imag = imag + obj.imag;
return temp;
}
void display() {
cout << real << " + " << imag << "i" << endl;
}
};
int main() {
Complex c1(3.0, 4.0), c2(1.0, 2.0);
Complex c3 = c1 + c2; // 연산자 오버로딩 사용
c3.display(); // 4.0 + 6.0i
return 0;
}
위의 예제에서 Complex 클래스는 + 연산자를 오버로딩하여 두 복소수를 더하는 기능을 구현합니다.
4. 템플릿: 함수 템플릿과 클래스 템플릿
템플릿은 데이터 형식에 상관없이 동일한 코드 로직을 사용할 수 있도록 하는 기능입니다. 이를 통해 코드의 재사용성을 높일 수 있습니다.
함수 템플릿
using namespace std;
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
cout << "int: " << add(1, 2) << endl; // 3
cout << "double: " << add(1.5, 2.5) << endl; // 4.0
return 0;
}
위의 예제에서 add 함수 템플릿은 데이터 타입에 관계없이 두 값을 더하는 기능을 제공합니다.
클래스 템플릿
using namespace std;
template <typename T>
class Calculator {
public:
T add(T a, T b) {
return a + b;
}
T subtract(T a, T b) {
return a - b;
}
};
int main() {
Calculator<int> intCalc;
Calculator<double> doubleCalc;
cout << "int add: " << intCalc.add(2, 3) << endl; // 5
cout << "double add: " << doubleCalc.add(2.5, 3.5) << endl; // 6.0
return 0;
}
위의 예제에서 Calculator 클래스 템플릿은 데이터 타입에 관계없이 덧셈과 뺄셈을 수행하는 기능을 제공합니다.
이번 글에서는 C++의 객체 지향 프로그래밍에 대해 알아보았습니다. 상속, 다형성, 연산자 오버로딩, 템플릿을 이해하고 활용하면 보다 강력하고 유연한 코드를 작성할 수 있습니다. 다음 단계에서는 표준 템플릿 라이브러리(STL)와 고급 기능을 학습해보세요. Happy Coding!
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 9. C++의 "파일 입출력" (0) | 2024.06.17 |
---|---|
[C++] 8. C++의 "표준 템플릿 라이브러리 (STL)" (0) | 2024.06.17 |
[C++] 6. C++의 "구조체와 클래스" (0) | 2024.06.17 |
[C++] 5. C++의 "포인터와 참조" (0) | 2024.06.14 |
[C++] 4. C++의 "배열과 문자열" (0) | 2024.06.14 |