출처 : https://www.digitalize.co.in/learn-c-c++/templates-in-c/

 

안녕하세요! 코딩하는 경제학도 쏘코입니다.

오늘 배울 내용은 함수와 클래스를 보다 편하게 쓸 수 있도록 도와주는 템플릿에 대한 내용입니다!

 

목차


    0. 함수 템플릿

    만약 같은 함수인데 다른 종류의 매개변수를 받아야 한다면, 매번 함수를 만들어 주어야 하는 단점이 발생합니다.

    아래 예시에서는 매개변수의 종류때문에 equal함수를 두번이나 만들어주는 수고로움이 있었습니다. 

    특히 double형 매개변수에 대한 설정을 하지 않았기 때문에 double형 변수를 넣어주면 int형 변수로 인식하여 원하지 않는 값(1)이 등장하는 것을 볼 수 있습니다.

    (분명 2.2랑 2.7은 다른데.. int로 바꾸면 버림이 일어나 둘다 2로 인식하여 같다고 출력됩니다!)

     

    이럴 때 사용할 수 있는 것이 바로 템플릿입니다.

    template <class 클래스명> 를 함수의 위에 써주면, 클래스명은 새로운 자료형이 되어서 들어오는 매개변수에 따라 매번 달라지게 됩니다.

    이러면 equal함수를 한 번만 만들어도 되니까 아주 편하죠?

     

    매개변수의 자료형 뿐만 아니라, 리턴형도 템플릿 클래스로 지정할 수 있습니다.

    이 경우 매개변수가 어떤 것이냐에 따라 결과값의 자료형도 결정이 됩니다!

     

    만약 서로 다른 자료형이 들어올 수 있다면, 템플릿을 2개 만들어서 만일의 상황에 대비할 수 있습니다!

     

    자료형의 이름을 직접 받아서 사용할 수도 있습니다. 굉장하죠?!!

    아래는 자료형을 받는 예시 2가지입니다!

     


    1. 클래스 템플릿

    함수에서 함수 템플릿을 사용했던 것과 똑같은 방식으로 클래스에서도 클래스 템플릿을 동일하게 사용할 수 있습니다.

    클래스 위에 template <typename 타입명> 을 붙여서, 클래스 내부에서는 타입명으로 사용하면 되는 것이죠!

     


    2. 컨테이너 : 우선순위큐

    컨테이너클래스, 자료구조, 추상 데이터 타입(ADT)을 모두 아우르는 개념입니다.

    흔히 STL이라고 부르는 vector, list, queue, stack, set, unordered_set 등이 모두 컨테이너이죠.

     

    그 중에서도 우선순위 큐에 대해서 간략하게 알아보도록 하겠습니다.

    우선순위큐는 queue를 전처리과정에서 불러와서 사용할 수 있습니다.

    큐는 FIFO(First In First Out) 규칙에 따라 들어온 순서대로 나가는 자료구조입니다. (자세한 설명은 생략합니다!)

    그런데 큐는 큐인데 왜 우선순위 큐이냐?

    들어오더라도 우선순위에 따라 정렬을 하기 때문입니다.

    기본적으로는 내림차순으로 정렬합니다.

     

    만약 내림차순이 싫다면 정렬 순서를 결정하는 클래스나 구조체를 이용해서 정렬 순서를 바꿔줄 수 있습니다.

    아래 예시에서는 우선순위큐에 들어가는 요소가 int이고, vector<int>형의 자료형을 가지고, Cmp라는 순서대로 정렬을 한다는 이야기가 됩니다.

    Cmp는 i2 < i1이기 때문에 작은 요소들이 앞으로 이동하게 되어서 오름차순으로 정렬됩니다.

     


    3. 반복자

    반복자(Iterator)는 컨테이너에 저장되어 있는 원소들을 훑을 때 사용하는 일종의 포인터와 같은 객체입니다.

    반복자에서는 *, ++, != 메소드를 사용할 수 있습니다.

     

    아래 예시는 iterator변수인 iter에 벡터의 시작주소를 넣어서 값을 추출하는 모습을 보여주고 있습니다.

     

    반복자를 사용해서 벡터의 요소들을 순서대로 출력할 수도 있습니다.

    iterator 대신 auto를 사용해도 동일합니다.

    end(vec)의 경우 vector의 마지막 요소의 다음 주소(null)을 담고 있다는 것을 기억해두면 유용합니다!

     


    4. 람다함수

    람다함수는 이름 없는 함수입니다.

    이름은 없지만, 함수와 동일하게 동작합니다.

    어떤 타입으로 반환이 되는 지는 명령문 이전에 위치하게 됩니다.

     

    아래 양식에서 captureLisit가 있는데, 이 부분에는 외부 변수를 어떻게 가져오는지에 대한 부분이 들어갑니다.

     

    아래는 captureList에 들어가는 요소들에 대한 설명입니다.

    보통은 =을 사용하여 const형태로 읽기만 가능한 형태로 가져오고,

    만약 요소를 변화시켜야 한다면 &를 이용하여 모든 외부 변수의 주소값을 가져와서 값을 변화시키게 됩니다.

     

    아래는 람다함수를 직접 사용한 예시입니다.

    =, &y의 경우 모든 외부변수를 복사하고, y만 참조하겠다는 말이겠죠!

     


    오늘의 템플릿의 기초와 컨테이너들을 다룰 수 있는 몇 가지 방법들, 그리고 람다함수에 대해서 알아봤습니다.

     

    제가 실제로 기말고사를 보는 시험범위는 여기까지입니다만, 카테고리를 완전하게 마무리 하기 위해서 시험범위 이외의 부분도 추가로 업로드가 될 예정입니다.

    따라서 여기가 마지막이 아니라 앞으로 몇 개의 포스팅이 추가로 업로드 될 예정입니다!

     

    그렇다면 다음 포스팅에서 뵙도록 하겠습니다 :)

    반응형
    • 네이버 블로그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기