본문 바로가기
NC University/Advanced C++

5일차 - begin & end

by 날쑤 2015. 8. 10.

Intro

  임의의 타입 T의 객체들을 원소로 가지는 vector<T>가 주어졌을 때, 이를 순회하면서 element들을 출력하는 함수를 작성해보자. 아마도 다음과 유사한 코드가 나올 것이다.

  여기서 Show 함수를 vector뿐만 아니라 모든 STL 컨테이너에 대해 적용되도록 바꾸려면 파라메터만 vector<T>& v에서 T& c로 수정하면 된다. 이제 이 함수를 사용해보자.

  위의 코드가 컴파일되지 않는 이유는 분명하다. 주석에 쓰여있는 것처럼 Show 함수는 대상 컨테이너의 멤버함수인 begin과 end를 이용하는데, build-in array에는 그런게 존재하지 않기 때문이다. 대상 컨테이너가 배열일 경우가 문제라면 예전 글에서 Max 함수를 구현했던 것과 유사하게 컨테이너가 배열일 경우와 아닐 경우로 나눠서 함수 오버로딩 기법을 적용하면 될 것이다. 이 때, 배열을 인자로 받는 오버로딩 함수는 begin이나 end 함수를 사용하지 않도록 구현해야한다.

  이제는 Show 함수를 built-in array에도 적용할 수 있다. 실제로 두번째 코드에서 Show(x)를 호출하면 정상적인 결과가 출력되는 것을 확인할 수 있다. 하지만 이 방식은 하나의 기능을 위해 3개의 함수 구현을 필요로 한다. 오버로딩 없이 정상적으로 기능이 동작하도록 하는 방법은 없을까?

begin & end

  C++ 11부터는 기존에 STL 컨테이너의 멤버함수로만 존재하던 begin과 end 함수를 일반 함수로도 쓸 수 있게 되었다. 그리고 built-in array를 포함한 다양한 컨테이너에 대해 동작하도록 구현해놓았다. 구현은 대충 아래와 같은 모양이라고 생각하면 된다. (실제로 확인해보니 STL 컨테이너, 배열, 그리고 initializer_list에 대해 구현되어 있었다.)

  그러므로 C++ 11부터는 함수 오버로딩없이 기존의 멤버함수 begin/end를 사용하던 부분을 일반함수 begin/end 함수를 쓰도록 수정하는 것만으로 배열을 포함한 모든 컨테이너에 대해 적용가능한 Show 함수를 만들 수 있게 되었다.