<객체> 10. 템플릿과 표준 템플릿 사리브러리(STL)

정지민·2023년 11월 15일
0

객체 프로그래밍

목록 보기
9/11

템플릿

  • 함수나 클래스를 일반화
  • template 키워드로 함수나 클래스 선언
  • 제네릭 타입 - 일반화를 위한 데이터 타입

템플릿 선언

  • template <class T> 또는 template <typename T>
  • 3 개의 제네릭 타입을 가진 템플릿 선언
    template <class T1, class T2, class T3>

구체화

템플릿의 제네릭 타입에 구체적인 타입 지정

제네릭 클래스 선언

template <class T>
class MyStack {
	int tos;
	T data [100]; // T 타입의 배열
public:
	MyStack();
	void push(T element); 
	T pop(); 
};

제네릭 클래스 구현

template <class T>
void MyStack<T>::push(T element) {
	...
}
template <class T> T MyStack<T>::pop() {
	...
}

클래스 구체화 및 객체 활용

MyStack<int> iStack; // int 타입을 다루는 스택 객체 생성
MyStack<double> dStack; // double 타입을 다루는 스택 객체 생성

iStack.push(3); 
int n = iStack.pop();

dStack.push(3.5); 
double d = dStack.pop();

STL

  • 제네릭 클래스와 제네릭 함수 포함

  • 구성
    - 컨테이너 – 템플릿 클래스
    - iterator – 컨테이너 원소에 대한 포인터
    - 알고리즘 – 템플릿 함수

vector 컨테이너

  • 가변 길이 배열을 구현한 제네릭 클래스
  • 벡터에 저장된 원소는 인덱스로 접근 가능
  • 인덱스는 0부터 시작

iterator

  • 반복자

  • iterator 변수 선언

vector<int>::iterator it;
it = v.begin();

map 컨테이너

  • (‘키’, ‘값’)의 쌍을 원소로 저장하는 제네릭 컨테이너
  • #include <map> 필요

알고리즘 함수

  • iterator와 함께 작동

  • sort() 함수

vector<int> v;
...
sort(v.begin(), v.begin()+3); // v.begin()에서 v.begin()+2까지, 처음 3개 원소 정렬
sort(v.begin()+2, v.begin()+5); // 벡터의 3번째 원소에서 v.begin()+4까지, 3개 원소 정렬
sort(v.begin(), v.end()); // 벡터 전체 정렬

auto

쉬운 변수 선언 가능
함수의 리턴 타입으로부터 추론하여 변수 타입 선언
vector<int>iterator 타입의 변수 it를 auto를 이용하여 간단히 선언

람다

수학 함수를 단순하게 표현하는 기법
[](int x, int y) { cout << x + y; }; // x, y의 합을 출력하는 람다식

0개의 댓글