본문 바로가기
c++

27. [C++] 함수 오버로딩, 디폴트 인자

by yoonjunho 2023. 1. 24.

함수 중첩 (함수 오버로딩(function overloading))

디폴트 인자(default parameter)

ㄴ둘 다 다른 객체지향 언어에서도 많이 사용하는 문법이다.

 

-함수중첩

-생성자 충첩(함수중첩에서 젤 많이 쓰는거)

-디폴트 인자(매개변수)

 

다형성(polymorphism)의 종류

-객체지향의 3가지 특성

:캡슐화 상속 다형성

-다형성은 : 비슷한 기능을 쓰면 이름은 하나만 쓰자  : 위키피디아

ㄴ종류는 3가지 ad hoc polymorphism :함수 중첩(오버로딩), 연산자 중첩(오버로딩) 

(adhoc : 항상 적용할 수 있는 것은 아니다 라는 뜻)

                         parametric polymorphism : 탬플릿(general function)

                         subtyping :상속(다형성에 넣기도 한다) 

ㄴ4가지를 배우게 된다.(함수오버로딩, 연산자 오버로딩, 탬플릿(general), vertual funcion)

 

객체지향언어에서 가장 많은 문법적인 그걸 가지고 있는 것이 다형성(polymorphism)이다.

 

compile time : 컴파일 할 때 다형성을 결정하는 방식

run time : 실행할 때 다형성을 결정하는 방식

 

 

 

 

실습 : 함수 중첩의 예시

#include <iostream>
using std::cout;
using std::endl;

int add(int i, int j) {
	return (i + j);
}
double add(double i, double j) {
	return (i + j);
}
int main() {
	std::cout << add(10, 20) << std::endl;
	std::cout << add(10.5, 20.3) << std::endl;
	return 0;
}

결과 : 

30
30.8

 

이름 같은 함수를 만들 때는, '매개변수가 다르게'해야된다. 

반환형만 다르고 매개변수가 같으면 오류가난다.

왜냐하면 함수를 호출 할 때, 어떤 함수를 호출해야하는지를 매개변수를 보고 판단하기 때문이다.->매개변수가 같고 다른게 다른 이름같은 함수가 여러 개이면, 그 중에 뭘 호출해야 하는지를 알 수 없게 된다.

#include <iostream>
using std::cout;
using std::endl;

int add(int i, int j) {
	return (i + j);
}
double add(int i, int j) { //이건 안된다.
	return ((double)i + (double)j);
}
double add(double i, double j) {
	return (i + j);
}

int main() {
	std::cout << add(10, 20) << std::endl;
	std::cout << add(10.5, 20.3) << std::endl;
	return 0;
}

 

실습 2 : 함수 중첩의 예 2 

#include <iostream>
using std::cout;
using std::endl;

int Max(int i, int j) {
	return i > j ? i : j;
}
double Max(double i, double j) {
	return i > j ? i : j;
}
char Max(char i, char j) {
	return i > j ? i : j;
}
//이렇게 내용이 완전 똑같고, 자료형만 다른 경우는,
//코드를 더 줄일 수 있다.(탬플릿)

int main() {
	std::cout << Max(1, 2) << std::endl;
	std::cout << Max(7.5, 3.6) << std::endl;
	std::cout << Max('A', 'B');
	return 0;
}

위의 코드에 탬플릿을 적용함

#include <iostream>
using std::cout;
using std::endl;
template <class T>//탬플릿 예시
//int이면 int로 다 찍어주고, double이면 double로 다 찍어주고
//->매번 함수를 만들어 낼 수 있다.
T Max(T i, T j) {
	return i > j ? i : j;
}

int main() {
	std::cout << Max(1, 2) << std::endl;
	std::cout << Max(7.5, 3.6) << std::endl;
    //std::cout << Max(7.5, 3) << std::endl; //<-이건 안 됨
	std::cout << Max('A', 'B');
	return 0;
}

실습 3 : 함수 중첩 c vs c++ 

ㄴ c에서는 함수 이름이 다 달라야 된다. 오버로딩이 안된다.

c++에서는 내부적으로 함수이름을 바꾸고, 소스에서는 함수 이름 똑같이 하면 매개변수를 보고 알아서 분류를 해준다. 오버로딩이 된다.

 

C

#include <stdio.h>

int add2(int i, int j) {
	return (i + j);
}
int add3(int i, int j, int k) {
	return (i + j+k);
}
int add4(int i, int j,int k, int l) {
	return (i + j+k+l);
}
int main() {
	printf("%d\n", add2(1, 2));
	printf("%d\n", add3(1, 2, 3));
	printf("%d\n", add4(1, 2, 3, 4));
}

C++

#include <iostream>

int add(int i, int j) {
	return (i + j);
}
int add(int i, int j, int k) {
	return (i + j+k);
}
int add(int i, int j,int k, int l) {
	return (i + j+k+l);
}
int main() {
	printf("%d\n", add(1, 2));
	printf("%d\n", add(1, 2, 3));
	printf("%d\n", add(1, 2, 3, 4));
}

 

 

 

 

 

 

 

오버로딩(overloading)은 서로 다른 여러개의 함수가 동일한 이름으로 정의되는 것이다.-c언어에서는 이게 안된다.

함수 오버로딩은 함수 인자의 타입을 다르게 하거나 개수를 다르게 하여 같은 이름을 가진 함수를 여러 개 만들 수 있다.

 

공부한 강의 : 

https://www.youtube.com/watch?v=LuoMcW8nqgE&list=PLJqaIeuL7nuG6EmLPNiHfHi4WWN9C5HNd&index=92 

 

'c++' 카테고리의 다른 글

[c++] c++제곱 연산  (0) 2023.02.18
[c++] 정수 나누기 연산자  (0) 2023.02.18
26. [C++] explicit  (0) 2023.01.24
25. [C++] 클래스에서의 static키워드  (0) 2023.01.21
24. [C++] static과 const 멤버  (0) 2023.01.21