인강 & 책 스터디 노트/Coursera 가속화된 컴퓨터 과학 기초

[C++]템플릿과 상속의 개념

thisisamrd 2024. 8. 11.

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++에서 고급 프로그래밍을 위한 중요한 기초 요소이며, 이를 통해 더욱 효율적이고 유연한 프로그램을 작성할 수 있습니다. 템플릿을 통해 타입 안전성을 유지하면서도 범용적으로 사용할 수 있는 코드를 작성할 수 있으며, 상속을 통해 코드의 재사용성을 높일 수 있습니다.

 

댓글