devRenio

템플릿과 표준 템플릿 라이브러리(STL)

객체지향프로그래밍II(김정준) 10주차 강의내용

일반화와 템플릿

  • 제네릭(generic) or 일반화
    • 함수나 클래스를 일반화시키고, 매개 변수 타입을 지정하여 틀에서 찍어 내듯이
    • 함수나 클래스 코드를 생산하는 기법
  • 템플릿
    • 함수나 클래스를 일반화하는 C++ 도구
    • template 키워드로 함수나 클래스 선언
      ◼ 변수나 매개 변수의 타입만 다르고, 코드 부분이 동일한 함수를 일반화시킴
    • 제네릭 타입 - 일반화를 위한 데이터 타입
    • 템플릿 함수보다 중복 함수가 우선 호출
  • 구체화(specialization)
    • 템플릿의 제네릭 타입에 구체적인 타입 지정
      ◼ 템플릿 함수로부터 구체화된 함수의 소스 코드 생성
    • 같은 제네릭 타입에는 같은 타입의 매개변수만을 사용해야 함
template <class T> // 템플릿 선언
template <class T1, class T2> // T1과 T2는 다를 수 있음
template <typename T>
void myswap (T & a, T & b) { // 구체화
  T tmp;
  tmp = a;
  a = b;
  b = tmp;
}
  • 템플릿의 장점
    • 함수 코드의 재사용
      ◼ 높은 소프트웨어의 생산성과 유용성
  • 템플릿의 단점
    • 포팅에 취약
      ◼ 컴파일러에 따라 지원하지 않을 수 있음
    • 컴파일 오류 메시지 빈약, 디버깅에 많은 어려움
  • 제네릭 프로그래밍
    • generic programming
      ◼ 일반화 프로그래밍이라고도 부름
      ◼ 제네릭 함수나 제네릭 클래스를 활용하는 프로그래밍 기법
      ◼ C++에서 STL(Standard Template Library) 제공. 활용
    • 보편화 추세
      ◼ Java, C# 등 많은 언어에서 활용
template <class T>
T add(T data [], int n) { // 제네릭타입 배열 data
  ...
}



제네릭 클래스

template <class T>
class MyStack { ... }; // 제네릭 클래스 선언

template <class T>
void MyStack<T>::push(T element) { ... } // 제네릭 클래스 구현

MyStack<int> iStack; // 제네릭 클래스 구체화(객체 생성)



C++ 표준 템플릿 라이브러리, STL

  • STL(Standard Template Library)
    • 표준 템플릿 라이브러리
      ◼ C++ 표준 라이브러리 중 하나
    • 많은 제네릭 클래스와 제네릭 함수 포함
      ◼ 개발자는 이들을 이용하여 쉽게 응용 프로그램 작성
  • STL의 구성

    • 컨테이너 – 템플릿 클래스
      ◼ 데이터를 담아두는 자료 구조를 표현한 클래스
      ◼ 리스트, 큐, 스택, 맵, 셋, 벡터
    • iterator – 컨테이너 원소에 대한 포인터
      ◼ 컨테이너의 원소들을 순회하면서 접근하기 위해 만들어진 컨테이너 원소에 대한 포인터
    • 알고리즘 – 템플릿 함수
      ◼ 컨테이너 원소에 대한 복사, 검색, 삭제, 정렬 등의 기능을 구현한 템플릿 함수
      ◼ 컨테이너의 멤버 함수 아님
STL 컨테이너의 종류
컨테이너 클래스 설명 헤더 파일
vector 가변 크기의 배열을 일반화한 클래스 <vector>
deque 앞뒤 모두 입력 가능한 큐 클래스 <deque>
list 빠른 삽입/삭제 가능한 리스트 클래스 <list>
set 정렬된 순서로 값을 저장하는 집합 클래스. 값은 유일 <set>
map (key, value) 쌍을 저장하는 맵 클래스 <map>
stack 스택을 일반화한 클래스 <stack>
queue 큐를 일반화한 클래스 <queue>
STL iterator의 종류
iterator의 종류 iterator에 ++ 연산 후 방향 read/write
iterator 다음 원소로 전진 read/write
const_iterator 다음 원소로 전진 read
reverse_iterator 지난 원소로 후진 read/write
const_reverse_iterator 지난 원소로 후진 read
STL 알고리즘 함수들
copy merge random rotate
equal min remove search
find move replace sort
max partition reverse swap
  • 헤더파일
    • 컨테이너 클래스를 사용하기 위한 헤더 파일
      ◼ 해당 클래스가 선언된 헤더 파일 include
      예) vector 클래스를 사용하려면 #include <vector>
      list 클래스를 사용하려면 #include <list>
    • 알고리즘 함수를 사용하기 위한 헤더 파일
      ◼ 알고리즘 함수에 상관 없이 #include <algorithm>
  • 이름 공간
    • STL이 선언된 이름 공간은 std

vector 컨테이너

  • 특징
    • 가변 길이 배열을 구현한 제네릭 클래스
      ◼ 개발자가 벡터의 길이에 대한 고민할 필요 없음
    • 원소의 저장, 삭제, 검색 등 다양한 멤버 함수 지원
    • 벡터에 저장된 원소는 인덱스로 접근 가능
      ◼ 인덱스는 0부터 시작
vector의 주요 멤버와 연산자
멤버와 연산자 함수 설명
push_back(element) 벡터의 마지막에 element 추가
at(int index) index 위치의 원소에 대한 참조 리턴
begin() 벡터의 첫 번째 원소에 대한 참조 리턴
end() 벡터의 끝(마지막 원소 다음)을 가리키는 참조 리턴
empty() 벡터가 비어 있으면 true 리턴
erase(iterator it) 벡터에서 it가 가리키는 원소 삭제. 삭제 후 자동으로 벡터 조절
insert(iterator it, element) 벡터 내 it 위치에 element 삽입
size() 벡터에 들어 있는 원소의 개수 리턴
operator[]() 지정된 원소에 대한 참조 리턴
operator=() 이 벡터를 다른 벡터에 치환(복사)
  • iterator 사용
    • iterator란?
      ◼ 반복자라고도 부름
    • 컨테이너의 원소를 가리키는 포인터
      ◼ iterator 변수 선언
    • 구체적인 컨테이너를 지정하여 반복자 변수 생성
vector<int>::iterator it;
it = v.begin();