저번 시간에 이어 vector 컨테이너에 대해 알아 보도록 하겠습니다.


vector 컨테이너는 배열 기반 컨테이너 이므로 일반 배열처럼 임의 위치의 원소를 참조하는 두 인터페이스를 제공합니다.

바로 [ ] 연산자, at( ) 멤버함수입니다.

두 인터페이스의 기능은 같지만 [ ] 연사자는 범위 점검을 하지 않아 속도가 빠르며 at( ) 멤버 함수는 범위를 점검하므로 속도는 느리자만 안전합니다.

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


<vector의 [ ]연산자와 at( ) 멤버 함수>

->[ ] 연산자는 범위 점검 없이 동작하며 at( ) 멤버 함수는 범위 점검을 하며 동작합니다. 만약 at( ) 멤버 함수 사용시 범위를 넘어가게 되면 범위 오류인 out_of_range 가 발생하게 됩니다.


이번엔 반복자에 대해 알아 보도록 하겠습니다.

컨테이너는 모든 원소의 시작과 끝을 가리키는 반복자 begin( )과 end( ) 멤버 함수로 제공합니다.

< vector의 begin( )과 end( )>

@

->iter는 반복자이며 ++연산자로 다음 원소로 이동하고 *연산자로 가리키는 원소를 참조합니다.

그림으로 보니 이해하기 더 쉽죠?ㅎㅎ

배열 기반 컨테이너인 vector와 deque는 임의 접근 반복자를 제공하며 임의 접근 반복자는 +, -, +=, -=, [ ]연산이 가능합니다.


<insert( ) 멤버 함수의 사용>

-> 반복자가 가리키는 바로앞에 값이 삽입되내요^^


삽입을 했다면 삭제도 있어야 겟죠?

<erase( ) 멤버 함수의 사용>

->v.erase(iter) : iter가 가리키는 위치의 원소(30)을 제거. 제거된 원소의 다음 원소를 가리키는 반복자를 반환

->v.erase(v.begin( )+1, v.end( )) : 구간 [v.begin( )+1, v.end( ))의 원소 (20,40,50)을 제거


vector 컨테이너의 몇가지 멤버함수를 알아 봤는데요. 이 외에도 더많은 함수를 제공한답니다.

오늘로서 표준 시퀀스 컨테이너이자 배열기반의 컨테이너인 vector의 포스팅을 마치고 다음시간에 deque에 대해 알아 보도록 하겠습니다.

글이 딱딱한 느낌인데 재밋게 써보도록 해보겠습니다^^


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

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

이번 장에서는 STL 컨테이너 중 시퀀스 컨테이너에 대하 알아보도록 하겠습니다.

STL 컨테이너는 시퀀스 컨테이너와 연관 컨테이너로 나눌 수 있습니다.

시퀀스 컨테이너 : 저장 원소가 삽입 순서에 따라 상대적인 위치를 갖는 컨테이너 (vector, list, deque)

연관 컨테이너 : 특정 정렬 규칙에 따라 상대적인 위치를 갖는 컨테이너(set, map, multiset, multimap)


먼저 시퀀스 컨테이너 중 하나인 vector컨테니어 에 대해 알아 보도록 하겠습니다.

vector 컨테이너는 배열과 비슷하여 사용이 쉽고 자주 사용되므로 잘 익혀 두시기 바랍니다.

<vector의 구조>

vector는 원소의 저장 위치가 정해지며 배열 기반 컨테이너이므로 원소가 하나의 메모리 블록에 할당된다.

시퀀스 컨테이너는 차례차례 원소를 추가하고 제거하는 push_back( )과 pop_back( )을 가지며, 첫 원소와 마지막 원소를 참조하는 front()와 back()을 가집니다. 또한 지정한 위치에 원소를 삽입할 수 있는 insert()를 가집니다. 반면 다른 시퀀스와 다르게 앞쪽에는 원소를 추가/제거할 수 없으며 뒤쪽에만 추가/제거할 수 있습니다.(다른 시퀀스 컨테이너는 앞쪽에도 추가/제거할 수 있습니다.)


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

<vector의 push_back( )>

-> v라는 vector컨테이너를 만들고 끝부분에 10, 20, 30, 40, 50을 추가하고 출력해주는 예제입니다. 쉽죠? ㅎ

<vector의 size(), capacity(), max_size()

-> size() : 저장 원소의 개수

-> capacity() : 실제 할당된 메모리 공간

-> max_size() : 컨테이너에 담을 수 있는 최대 원소의 개수

그렇다면 결과는 어떻게 될까요??

 size()와 max_size()는 모든 컨테이너가 가지는 멤버 함수입니다. 하지만, capacity()는 유일하게 vector만이 가지는 멤버 함수입니다.

vector 컨테이너는 배열 기반 컨테이너이므로 연속한 메모리를 한 번에 할당하지만, 계속 원소가 추가될 수 있습니다. 원소가 추가될 때마다 메모리를 재할당하고 이전 원소를 모두 복사해야 한다면 너무나 비효율적일 것입니다. 따라서 재할당에 드는 성능 문제를 보완하고자 만들어지 개념이 capacity입니다. capacity()를 예제를 통해 좀 더 쉽게 이해해 보도록 하겠습니다.

<vector의 capacity()>

->결과를 보면 미리 저장할 메모리의 크기를 크게 하면 원소가 추가돼도 메모리의 크기가 변하지 않게 됩니다.

->또한 미리 메모리를 예약할 수 있는 reserve()를 제공합니다. ex) v.reserve(8) // 8만큰의 메모리 할당

<vector 생성자의 초기값 지정>

1. vector<int> v(5)  : 기본값 0으로 초기화된 size가 5인 컨테이너

2. vector<int> v(5,1) : 기본값 1로 초기화된 size가 5인 컨테이너

3. vector<int> v(v1) : v는 v2컨테이너의 복사본 컨테이너


<vector의 clear( )와 empty( )>

->v.clear() : v를 비운다.

->v.empty() : v가 비었는지 검사한다.

@

->결과를 보시면 size는 0이 되어도 메모리는 제거되지 않고 남아 있게 됩니다.

->swap방법을 이용하여 capacity를 0으로 만들수 있습니다.


<swap을 이용한 할당 메모리 제거>

@

-> 이렇게 swap을 이용하니 할당 메모리를 제거할 수 있내요~


vector 컨테이너의 남은 내용은 다음시간에 이어서 하도록 하겠습니다. ^^




<작성자 - CODER_CJH>

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





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

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

템플릿은 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

안녕하세요 이번시간에는 STL에 필요한 주요 연산자 오버로딩에 대해 배워보겠습니다.


첫번째로 함수 호출 연산자 오버로딩(()연산자)에 대해 알아 보겠습니다.

함수 호출 연산자 오버로딩은 객체를 함수처럼 동작하게 하는 연산자입니다.

C++에서 Print(10)이라는 함수 호출 문장은 다음 세 가지로 해석할 수 있습니다.

1. 함수호출 : Print가 함수 이름

2. 함수포인터 : Print가 함수 포인터

3. 함수 객체 : Print가 함수 객체

여기서 함수 호출 연산자를 정의한 객체를 함수 객체라 합니다.

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


두번쨰로 배열 인덱스 연산자 오버로딩([]연산자)에 대해 알아 보도록하겠습니다.

배열 인덱스 연산자 오버로딩을 사용하면 배열에 사용하는 []연산자를 객체에도 사용할 수 있습니다.

[]연산자 오버로딩은 일반적으로 많은 객체를 저장하고 관리하는 객체에 사용됩니다.

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

@

pt[0]는 pt.operator[](0)을 호출해 pt.x값을 반환 받습니다.

[]연산자 오버로딩은 일반적으로 컨테이너 객체에 사용됩니다. 컨테이너 객체가 곤리하는 내부 원소에 접근할 때 사용됩니다.



세번째로 ->연산자 오버로딩에 대해 알아보겠습니다.

예제를 보시겠습니다.

p1->Print()는 p1.operator->()함수를 호출해 ㅔ1 내부에 보관된 실제 포인터를 반환 받고 이 포인터를 이용해 실제 point의 멤버 함수를 호출합니다.


이상으로 연산자 오버로딩에 대한 포스팅을 마치겠습니다.

궁금하신점이나 오류가 있으면 댓글남겨주세요 ~

다음시간에 함수 포인터에 대해 다뤄보겠습니다.




<작성자 - CODER_CJH>

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

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

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

첫번째 포스팅에 이어 바로 연산자 오버로딩 포스팅을 하겠습니다.

C++, JAVA를 한번쯤 공부해 보신분들은 오버로딩이라는 단어를 많이 들어 보셨을거라 생각합니다.

다시 살펴보도록 하겠습니다. 매우 중요한 개념이므로 꼭 숙지하고 넘어가시기 바랍니다.!

오버로딩(중복정의) : 하나의 클래스 내에서 이름이 같은 여러 개의 메서드를 정의한 것.(매개변수가 다름- 매개변수의 수, 배치순서)

오버라이딩(재정의) : 상속관계에 있을 때 부모로 부터 상속받은 기능 즉 메서드가 기능적으로 불필요한 경우에 자식클래스가 다시 정의하는 것

(이름이 같아야함, 매개변수가 같아야함, 리턴타입이 같아야함)


그렇다면 연산자 오버로딩은 무엇일까요?

 : C++에서 제공하는 기본 타입이 아닌 클래스 타입, 즉 사용자 정의 타입에도 연산자를 사용할 수 있게 하는 문법.

      

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

       

        기본적으로 컴파일러에 연산이 정의되어 있기 떄문에 가능합니다.

  

  그러나 위에 예시를 보면 p1+p2에 에러가 나는 것을 볼수 있는데요 이는 사용자가 정의한 클래스에 대한 연산을 컴파일러가 알고 있지 않기 때문입니다. 따라서 연산자 오버로딩을 통해 컴파일러 내부에 정의되지 않은 타입의 연산을 가능하게 할 수 있습니다.


자 이제 연산자 오버로딩을 정의하고 사용해 보도록 하겠습니다

위 코드의 출력 결과는 어떻게 될까요?

@ 

Point 객체의 +연산자를 정의한 함수가 호출 되었습니다.

그렇다면 이제 operator+()의 내부를 정의 해 보겠습니다

두 Point객체 p1과 p2를 더하는 것은 p1의 x와 p2의 x를 더하고 p1의 y와 p2의 y를 더한다는 의미입니다. 

    @ 


이렇게 연산자 오버로딩은 컴파일러와 약속된 함수를 이용해 사용자 정의 타입에 연산이 가능하도록 제공하는 것입니다.

기본적인 연산자 오버로딩에 대한 개념이 잡히셨나요?
다음시간에는 STL에 필요한 주요 연산자 오버로딩에 대해 알아 보도록 하겠습니다.





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



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

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

안녕하세요 C++파트를 맡고있는 시그마알파 얼굴 담당 입니다.

작년 여름에 시그마알파를 만들고 바로 블로그를 하려했으나 다들 바쁜관계로 하지못했습니다.

오늘 2016년 6월 1일 새로운 마음으로 시작해보려합니다.


제가 가장 먼저 다룰 내용은 C++라이브러리 STL입니다.

STL은 Standard Template Library의 약자로 C++에서 제공하는 표준 라이브러리입니다.


그렇다면 왜 STL을 알아둬야할가요?

바로 여러 장점을 가지고 있기 때문입니다.

첫째. 일반화를 지원할 수 있습니다.

둘쨰. 컴파일 타임의 매커니즘을  사용하므로 실행시 효율 저하가 거의 없습니다.

셋째. 표준으로 정해놨기 때문에 이식성이 좋습니다.

넷쨰. 소스가 공개되있어 확장성이 좋습니다.

보셨다시피 이러한 장점을 가지고 있는데 사용안할 수 없겠죠?


STL을 배우기 전에 꼭알아 야 될 문법이 몇개 있는데요

1. 연산자 오버로딩

2. 함수 포인터

3. 함수 객체

4. 템플릿

C++을 공부하셨다면 다들 아실거라 생각합니다. 그러나 복습차원에서 다시 공부하고 STL에 학습에 들어가도록 하겠습니다.




<작성자 - CODER_CJH>

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

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

6. 템플릿  (0) 2016.06.01
5.함수 객체  (0) 2016.06.01
4. 함수 포인터  (1) 2016.06.01
3. STL에 필요한 주요 연산자 오버로딩(2)  (4) 2016.06.01
2. 연산자오버로딩(1)  (0) 2016.06.01

+ Recent posts