C++에서 템플릿은 타입에 독립적인 코드를 작성할 수 있도록 도와주는 강력한 도구입니다. 이를 통해 컴파일 시에 다양한 타입으로 변환할 수 있으며, 이로 인해 코드의 유연성과 재사용성이 증가합니다. 이제 위에서 설명한 개념과 예시 코드를 기반으로 각 개념을 상세히 설명하겠습니다.
템플릿 타입과 std::vector
템플릿 타입은 다른 타입을 가질 수 있는 특별한 타입입니다. std::vector는 C++ 표준 라이브러리에서 제공하는 동적 배열로, 템플릿 타입을 사용합니다. 이는 다양한 타입의 데이터를 담을 수 있는 배열을 생성할 수 있음을 의미합니다. 예를 들어, std::vector<char>, std::vector<int>, std::vector<uiuc::Cube>와 같이 사용할 수 있습니다.
#include <vector>
#include <iostream>
int main() {
std::vector<int> v;
v.push_back(2);
v.push_back(3);
v.push_back(5);
std::cout << v[0] << std::endl;
std::cout << v[1] << std::endl;
std::cout << v[2] << std::endl;
return 0;
}
- 이 코드는 std::vector를 사용하여 정수형 벡터를 생성하고, push_back 메서드를 사용해 요소를 추가합니다.
- v[0], v[1], v[2]를 출력하여 추가된 값을 확인합니다.
- 출력 결과는 2, 3, 5입니다
템플릿 함수
템플릿 함수는 하나의 함수가 여러 타입의 인수를 처리할 수 있도록 해줍니다. 이를 위해 함수 정의 앞에 template <typename T>를 선언하여 템플릿 타입을 지정합니다.
template <typename T>
T max(T a, T b) {
if (a > b) { return a; }
return b;
}
int main() {
std::cout << "max(3, 5): " << max(3, 5) << std::endl;
std::cout << "max('a', 'd'): " << max('a', 'd') << std::endl;
std::cout << "max(\"Hello\", \"World\"): " << max("Hello", "World") << std::endl;
return 0;
}
- max 함수는 두 개의 같은 타입 인자를 받아서 더 큰 값을 반환합니다.
- max(3, 5), max('a', 'd')는 정상 작동하지만, 문자열 리터럴 비교는 주소를 비교하므로 논리적으로 의미가 없습니다.
- 출력 결과는 max(3, 5): 5, max('a', 'd'): d, max("Hello", "World"): Hello입니다.
상속
상속은 클래스가 다른 클래스의 모든 멤버 함수와 데이터를 상속받는 것을 말합니다. 이를 통해 클래스 간의 계층 구조를 만들 수 있습니다.
#pragma once
class Shape {
public:
Shape();
Shape(double width);
double getWidth() const;
private:
double width_;
};
#pragma once
#include "Shape.h"
#include "HSLAPixel.h"
namespace uiuc {
class Cube : public Shape {
public:
Cube(double width, uiuc::HSLAPixel color);
double getVolume() const;
private:
uiuc::HSLAPixel color_;
};
}
- Cube 클래스는 Shape 클래스를 상속받아 정의되었습니다.
- Cube는 Shape의 모든 public 멤버를 접근할 수 있으며, getVolume() 메서드를 통해 부피를 계산합니다.
- width_는 private로 선언되어 직접 접근이 불가능하므로, getWidth() 함수를 사용합니다.
초기화 리스트
#include "Shape.h"
Shape::Shape() : Shape(1) {
// Nothing.
}
Shape::Shape(double width) : width_(width) {
// Nothing.
}
double Shape::getWidth() const {
return width_;
}
#include "Cube.h"
#include "Shape.h"
namespace uiuc {
Cube::Cube(double width, uiuc::HSLAPixel color) : Shape(width) {
color_ = color;
}
double Cube::getVolume() const {
return getWidth() * getWidth() * getWidth();
}
}
- Shape 클래스의 생성자는 초기화 리스트를 사용하여 width_를 초기화합니다.
- Cube 클래스의 생성자에서는 초기화 리스트를 사용해 Shape 클래스의 생성자를 호출합니다.
- 초기화 리스트는 객체의 초기화 시점을 관리하며, 성능상 이점을 제공합니다.
이 모든 개념은 C++에서 고급 프로그래밍을 위한 중요한 기초 요소이며, 이를 통해 더욱 효율적이고 유연한 프로그램을 작성할 수 있습니다. 템플릿을 통해 타입 안전성을 유지하면서도 범용적으로 사용할 수 있는 코드를 작성할 수 있으며, 상속을 통해 코드의 재사용성을 높일 수 있습니다.
'인강 & 책 스터디 노트 > Coursera 가속화된 컴퓨터 과학 기초' 카테고리의 다른 글
[C++] 복사 생성자와 복사 대입 연산자의 차이점 (0) | 2024.08.05 |
---|---|
[c++] 클래스 생성자 - 자동 디폴트 생성자, 사용자 지정 생성자 (0) | 2024.08.04 |
[c++] 힙 메모리(Heap Memory) (0) | 2024.07.31 |
[c++] 스택 메모리, 포인터 (0) | 2024.07.30 |
[C++] iostream 라이브러리, 네임스페이스, using 키워드 (0) | 2024.07.30 |
댓글