내일배움캠프 14일차 - C++ 문법 : 함수 오버로딩, 템플릿

함수 오버로딩

 - C++에서는 C언어와는 다르게 동일한 이름의 함수를 여러 개 정의할 수 있다.

 - C언어는 함수 이름으로만 함수를 구분하지만, C++은 함수 이름과 매개변수 타입 정보를 함께 사용해 구분하기 때문. (단, 함수의 반환형만으로는 오버로딩이 성립하지 않음)

오버로딩이 되는 경우:

 1) 매개변수 타입이 다름

 2) 매개변수 개수가 다름

오버로딩이 되지 않는 경우:

 1) 타입변환이 가능한 매개변수로 인해 두 개 이상의 오버로딩된 함수가 호출 후보가 됨.

 2) 디폴트 매개변수로 인해 호출시 요구 타입, 요구 개수가 동일해 함수 호출 형태가 중복됨

 3) 매개변수의 타입만 포인터와 배열로 다름

 4) 함수의 반환 타입만 다름

가능1) 매개변수 타입이 다른 함수 오버로딩

가능2) 매개변수 개수가 다른 함수 오버로딩

불가능1) 타입변환이 가능한 매개변수

불가능2) 디폴트 매개변수로 인해 요구 타입, 요구 개수가 사실상 같음

불가능3) 매개변수의 타입만 포인터와 배열로 다름
※ 포인터와 배열은 메모리 주소를 여러 개 쓴다는 공통점으로 같은 타입으로 취급되는 듯.

불가능4) 반환 타입만 다른 함수 오버로딩

함수 오버로딩의 순서

C++에서는 아래와 같은 명확한 우선순위 규칙에 따라 호출할 함수를 결정한다.

① 정확한 매칭
   ↓
타입 승격 변환
   ↓
③ 표준 타입 변환
   ↓
④ 사용자 정의 타입 변환

1) 정확한 매칭
 - 호출 인자 타입매개변수 타입이 정확히 일치함


2) 타입 승격 변환
 - 값이 손실되지 않는 방향으로 변환하는 것을 승격이라고 한다.

※ char타입 함수호출은 가능하나, 값의 변형을 크게 일으키므로 호출 순위에서 밀렸다.

※ 같은 이유로 float은 int변환보다는 double변환을 우선한다.

※ 주의: 두 함수의 매개변수가 같은 변환 순서에 있다면 모호성으로 인해 에러가 발생한다.


3) 표준 타입 변환
 - 승격보다는 조금 더 광범위하므로 값 손실이 발생하는 경우가 있다.


4) 사용자 정의 타입 변환

 - 클래스 타입의 변환 함수나 생성자 등을 통해 이뤄지는 변환이다.
 - 연산자 오버로딩(operator)을 통해 변환이 가능하다.


템플릿

타입에 관계없이 일반화된 코드를 작성하기 위한 문법이다.

템플릿을 이용한 일반화된 함수는 아래와 같은 형태로 정의한다.

template <typename T>

이 코드는 미지의 타입을 T라고 부르겠다는 의미이다.

이후에는 일반화하려는 타입 자리에 실제 타입 대신 T를 사용하면 된다.

예를 들어, 아래와 같이 처음 T로 정의되는 타입그 함수 내에서 사용할 T라고 보는 것이다.
 → 함수 3개를 오버로딩하는 대신 하나의 템플릿 함수로 정의할 수 있게 된다.


템플릿 클래스

함수 뿐만 아니라, 클래스도 템플릿을 사용해 일반화할 수 있다.

템플릿타입을 사용한 클래스를 변수로 선언 시 < > 안에 T의 타입을 정의해야 한다.

예시) T=double선언 클래스, T=int선언 클래스

댓글

이 블로그의 인기 게시물

내일배움캠프 사전캠프 - 사전캠프설 연휴 커피 파밍 이벤트 작품 [ EXTREMITY ]

내일배움캠프 29일차 - 커리어데이 2일차 : 클라이언트 프로그래머로서 포트폴리오, 입사준비팁