내일배움캠프 14일차 - C++ 문법 : 함수 오버로딩, 템플릿
함수 오버로딩
- C++에서는 C언어와는 다르게 동일한 이름의 함수를 여러 개 정의할 수 있다.
- C언어는 함수 이름으로만 함수를 구분하지만, C++은 함수 이름과 매개변수 타입 정보를 함께 사용해 구분하기 때문. (단, 함수의 반환형만으로는 오버로딩이 성립하지 않음)
오버로딩이 되는 경우:
1) 매개변수 타입이 다름
2) 매개변수 개수가 다름오버로딩이 되지 않는 경우:
1) 타입변환이 가능한 매개변수로 인해 두 개 이상의 오버로딩된 함수가 호출 후보가 됨.
2) 디폴트 매개변수로 인해 호출시 요구 타입, 요구 개수가 동일해 함수 호출 형태가 중복됨
3) 매개변수의 타입만 포인터와 배열로 다름
4) 함수의 반환 타입만 다름
| 가능1) 매개변수 타입이 다른 함수 오버로딩 |
| 가능2) 매개변수 개수가 다른 함수 오버로딩 |
| 불가능1) 타입변환이 가능한 매개변수 |
| 불가능2) 디폴트 매개변수로 인해 요구 타입, 요구 개수가 사실상 같음 |
| 불가능3) 매개변수의 타입만 포인터와 배열로 다름 ※ 포인터와 배열은 메모리 주소를 여러 개 쓴다는 공통점으로 같은 타입으로 취급되는 듯. |
| 불가능4) 반환 타입만 다른 함수 오버로딩 |
함수 오버로딩의 순서
C++에서는 아래와 같은 명확한 우선순위 규칙에 따라 호출할 함수를 결정한다.
① 정확한 매칭
↓
② 타입 승격 변환
↓
③ 표준 타입 변환
↓
④ 사용자 정의 타입 변환
1) 정확한 매칭
- 호출 인자 타입과 매개변수 타입이 정확히 일치함
- 값이 손실되지 않는 방향으로 변환하는 것을 승격이라고 한다.
| ※ char타입 함수호출은 가능하나, 값의 변형을 크게 일으키므로 호출 순위에서 밀렸다. |
- 연산자 오버로딩(operator)을 통해 변환이 가능하다.
타입에 관계없이 일반화된 코드를 작성하기 위한 문법이다.
템플릿을 이용한 일반화된 함수는 아래와 같은 형태로 정의한다.
template <typename T>
이 코드는 미지의 타입을 T라고 부르겠다는 의미이다.
이후에는 일반화하려는 타입 자리에 실제 타입 대신 T를 사용하면 된다.
예를 들어, 아래와 같이 처음 T로 정의되는 타입을 그 함수 내에서 사용할 T라고 보는 것이다.
→ 함수 3개를 오버로딩하는 대신 하나의 템플릿 함수로 정의할 수 있게 된다.
→ 함수 3개를 오버로딩하는 대신 하나의 템플릿 함수로 정의할 수 있게 된다.
템플릿 클래스
함수 뿐만 아니라, 클래스도 템플릿을 사용해 일반화할 수 있다.
템플릿타입을 사용한 클래스를 변수로 선언 시 < > 안에 T의 타입을 정의해야 한다.
| 예시) T=double선언 클래스, T=int선언 클래스 |
댓글
댓글 쓰기