함수 중첩 (함수 오버로딩(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 |