템플릿은 STL 제너릭 프로그래밍의 핵심이라고 할 수 있습니다.

템플릿은 컴파일 타임에 클라이언트가 여러 타입의 함수나 클래스를 쉽게 생성하게 하고, 서버 코드 작성자는 좀더 일반적인 프로그램 코드를 만들고 클라이언트가 구체적인 코드를 작성함으로써 제너릭한 프로그래밍이 가능하게 합니다.

템플릿에는 함수 템플릿과 클래스 템플릿이 있습니다.

템플릿의 강력한 기능을 설명하기 위해 간단한 예제를 살펴보겠습니다.

위 예제는 간단하게 정수를 출력하는 예제입니다. 만약 여기에 실수와 문자열을 출력하는 두 함수를 추가 하려고 한다면 함수 오버로딩을 이용하면 됩니다. 그러나 함수 오버로딩은 클라이언트가 매개변수 타입을 미리 알고 있다는 전제로 만들어집니다. 만일 클라이언트에서 사용자 정의 타입을 결정해야 한다면 함수 오버로딩으로 해결할 수  없습니다. 그러나 템플릿을 이용하면 이 문제를 간단하게 해결할 수 있습니다.


위의 정수 출력 예제를 템플릿을 사용하여 사음과 같이 변형할 수 있습니다.

매우 유용한 기능이내요 ㅎ


연습 예제로 swap() 함수를 템프릿 버전으로 만들어 보겠습니다.


다음은 클래스 템플릿에 대해 알아보도록 하겠습니다.

클래스 템플릿은 함수 템플릿과 별반 다르지 않습니다. 단지 함수에서 클래스로 바뀐 것뿐입니다.

예제를 통해 알아보도록 하겠습니다.

아래 소스는 장수 자료를 저장,관리하는 Array 클래스입니다.

이렇게 정의하게 되면 여러가지 타입의 Array클래스의 객체를 사용할수 있게 됩니다.


후~ 드디어 STL에 들어가기전 기본 문법에 대해서 알아보았내요. 

다음시간에는 STL에 대해서 알아 보도록 하겠습니다.

연산자오버로딩, 함수포인터, 함수객체, 템플릿에 대하여 숙지하지 못하신분들은 꼭 다시 둘러보고 STL에 들어가도록 합시다!!






<작성자 - CODER_CJH>

<참고자료 - 뇌를 자극하는 C++STL>

'Programming Language > C++' 카테고리의 다른 글

8. vector 컨테이너(2)  (0) 2016.06.03
7. vector 컨테이너(1)  (0) 2016.06.03
5.함수 객체  (0) 2016.06.01
4. 함수 포인터  (1) 2016.06.01
3. STL에 필요한 주요 연산자 오버로딩(2)  (4) 2016.06.01

이번 시간에는 함수 객체에 대해 알아보도록 하겠습니다.

함수 객체란 ? 함수처럼 호출 가능한 클래스 객체입니다.

함수 객체는 함수처럼 사용할 수 있으면서도 상태를 가질 수 있기 때문에 STL은 함수보다 함수 객체를 선호합니다.

함수 객체를 함수처럼 동작하게 하려면 '()'연사자를 정의해야 합니다. 다시말해 '()'연사자를 오버로딩한 객체입니다.


간단한 예제를 통해 이해해 보도록 하겠습니다.


functor는 객체지만 함수처럼 호출할 수 있습니다.


그렇다면 일반함수보다 복잡해 보이는 함수 객체를 사용하는 이유가 무엇일가요?

그이유는 이렇습니다.

먼저 함수처럼 동작하는 객체이므로 다른 멤버 변수와 멤버 함수를 가질 수 있고 일반 함수에서 하지 못하는 지원을 받을 수 있습니다.

또한, 함수 객체의 서명이 같더라도 타입이 다르면 서로 전혀 다른 타입으로 인식합니다. 속도도 일반 함수보다 함수 객체가 빠릅니다. 

함수의 주소를 전달하여 콜백하는 경우 이 함수 포인터는 인라인될 수 없지만 함수 객체는 인라인될 수 있고, 컴파일가 쉽게 최적화할 수 있습니다.

이와같은 장점 때문에 함수 객체를 사용하게됩니다.


간단한 예제를 통해 함수 객체의 장점을 보겠습니다.


여기서 operator()(int n)함수는 클래스 내부에 정의되므로 암묵적으로 인라인 함수가 됩니다.



함수 객체에 대하여 이해가 가셨나요?

그렇다면 지금부터 함수 객체를 구현해보도록 하겠습니다.


첫번째로 less( < 연사자의 함수객체 )를 구현해보도록 하겠습니다.


Pred_less()함수는 두 정수를 입력받아 < 연산의 결과를 반환합니다.

1()은 함수객체로 두 정수를 입력받아 l.operator()()을 호출하고 결과를 반환합니다.

결과는 어떻게 될까요?


@

생각하신 결과가 맞으신가요? ㅎㅎ


greater( >연산자의 함수 객체)는 위의 less함수객체를 조금만 변형시키면 됩니다. 직접해보시기 바랍니다~^^



함수 객체의 포스팅은 여기서 마치도록하겠습니다.

다음시간에는 템플릿에 대해 알아보도록 하겠습니다.





<작성자 - CODER_CJH>

<참고자료 - 뇌를 자극하는 C++STL>



'Programming Language > C++' 카테고리의 다른 글

7. vector 컨테이너(1)  (0) 2016.06.03
6. 템플릿  (0) 2016.06.01
4. 함수 포인터  (1) 2016.06.01
3. STL에 필요한 주요 연산자 오버로딩(2)  (4) 2016.06.01
2. 연산자오버로딩(1)  (0) 2016.06.01

오늘은 함수 포인터에 대해 알아보겠습니다.

포인터는 뭘까요? 주소를 저장하는 메모리 공간의 이름입니다.

함수 포인터는 말그대로 함수의 주소를 저장하는 포인터입니다.


간단하게 예제를 통해 포인터 개념을 되새기고 넘어가도록 하겠습니다.


포인터 pn이  정수형변수 n을 가리키고 있는 것입니다.


그렇다면 본격적으로 함수 포인터 선언과 사용을 해보겠습니다.

함수 포인터는 함수 시그너처(함수의 반환 타입과 매개변수 리스트)와 같게 선언.

예를 들어 int func(int a,int b)인 함수의 함수 포인터는 int(*pf)(int ,int )와 같이 선언합니다.

예제를 통해 확인해 보도록 하겠습니다.

이 예제의 경우 어떤것이 출력 될까요?

바로 Print()함수의 주소입니다.

Print()함수의 시그너처가 void Print(int n)이므로 함수 포인터는 void (*pf)(int)로 선언합니다.


함수 포인터의 선언과 사용에 대해 알아 봤는데요. 지금부터 함수 포인터의 종류에 대하 알아보도록 하겠습니다.

들어가기 앞서 C++에는 세 가지의 함수 호출 방법이 있습니다.

1. 정적 함수 호출(정적 함수)

2. 객체로 멤버 함수 호출(멤버 함수)

3. 객체의 주소로 멤버 함수 호출(멤버 함수)

위 세 가지 방벙을 예제로 이해해 보겠습니다

Point객체 pt를 만들고 포인터p가 pt를 가리키고있내요.


다음으로 클라이언트 코드와 서버 코드에 대해 알아 보도록 하겠습니다.

서버 코드란 어떤 기능이나 서비스를 제공하는 코드측을 말합니다.

클라이언트 코드란 그기능을 제공받는 코드측을 말합니다.

일반적으로 서버는 하나지만 서버코드를 사용하는 클라이언트는 여러 개입니다.

예제를 통해 이해해 보도록 하겠습니다.

이해가시나요? main함수가 PrintHello()라는 기능을 제공받고 있으므로 클라이언트가됩니다.

반면 PrintHello()함수는 출력 기능을 제공하므로 서버가됩니다.


일반적으로 클라이언트 코드 측에서 서버를 호출하고 기능을 사용하지만, 때때로 서버가 클라이언트를 호출해야 하는 경우도 있습니다.

이처럼 클라이언트가 서버를 호출하면 콜(call)이라 하고 서버가 클라이언트를 호출하면 콜백(callback)이라 합니다.

STL의 많은 알고리즘도 콜백을 이용해 클라이언트 정책을 반영하고, 윈도의 모든 프로시저는 시스템이 호출하는 콜백입니다.

함수 포인터를 이용한 콜백 매커니즘을 구현 해보도록 하겠습니다.

클라이언트는 서버함수 For_each()를 세 번 호출합니다. 하지만, 세 번의 출력 결과는 클라이언트에 의해 결정됩니다. 출력 정책은 클라이언트만 알고 있습니다.

@ 

이처럼 콜백 메커니즘을 이용하면 알고리즘 적챙을 클라이언트에서 유연하게 바꿀 수 있게 서버를 더욱 추상화할 수 있습니다.


이제 함수 포인터에 대한 개념이 어느 정도 이해되셨나요? ㅎㅎ

저도 초보라 설명이 미숙한점 이해해 주시기 바랍니다.

다음 시간에는 함수 객체에 대하여 알아보도록 하겠습니다. 



<작성자 - CODER_CJH>

<참고자료 - 뇌를 자극하는 C++STL>

'Programming Language > C++' 카테고리의 다른 글

6. 템플릿  (0) 2016.06.01
5.함수 객체  (0) 2016.06.01
3. STL에 필요한 주요 연산자 오버로딩(2)  (4) 2016.06.01
2. 연산자오버로딩(1)  (0) 2016.06.01
1. STL에 들어가기 앞서...  (1) 2016.06.01

+ Recent posts