이번 강의는 오버로딩과 디폴트 인수에 대한 내용이다.
1. 함수 오버로딩
정의 - 같은 이름을 가진 함수를 여러 개 정의할 수 있으며 각 함수는 서로 다른 타입을 가지는 매개변수로 정의해야 한다.
즉, 매개변수가 다르며 이름이 동일한 함수이다.
예시)
#include <iostream>
int add(int n1, int n2);
float add(float f1, float f2);
int main()
{
printf("%d\n", add(1, 2));
printf("%f\n", add(1.f, 2.f));
}
int add(int n1, int n2)
{
return n1 + n2;
}
float add(float f1, float f2)
{
return f1 + f2;
}
함수 오버로딩은 위에 설명과 같이 동일한 이름의 함수가 서로 다른 매개변수 리스트를 가지는데
int add(int n1, int n2);
float add(float f1, float f2);
- int형 add와 float add 즉, 매개변수가 int, float의 차이일 뿐 이름은 같은 것을 볼 수 있다.
int main()
{
printf("%d\n", add(1, 2));
printf("%f\n", add(1.f, 2.f));
}
- 첫 번째 출력의 경우 int타입의 add 함수를 호출한다.
- 두 번째 출력의 경우 float타입의 add 함수를 호출한다.
1.1 함수 오버로딩을 잘 사용하지 않는 이유
- 오버로딩의 장점 중 가독성이 좋다고 하는데 여러 개의 기능을 하나로 통합해서 사용하는 거지 가독성이 높은 것은 아니다.
- 개수가 많아지면 묶음으로 묶어서 사용해야 편한 것이지 기능이 많다고 좋은 것은 절대 아니다. ( 일일이 찾아서 사용하기 힘들기 때문)
- 보통 함수는 이름으로 목차를 만들어서 바로바로 꺼내서 쓰는 경우가 더 빠르기 때문에 잘 사용을 하지 않는다.
즉, 한 라인에 한 가지 일, 한 객체에 명확하게 한 가지의 하는 일, 한 함수에 한 가지 일을 수행하는 함수를 코딩하는 것이 좀 더 편한 코드라고 볼 수 있다.
1.2 ( 중요 ) 오버로딩이 불가능한 경우
오버로딩이 불가능한 경우는 다양하다. 공부를 하면 할수록 안 되는 경우는 점점 늘어가게 될 것이다.
간단하게 요약하자면 오버로딩이 안 되는 주된 요인은 컴파일러가 판단이 안 되는 경우 전부 사용이 불가능하다.
즉, 내가 함수를 호출했는데 컴퓨터 입장에서 어디로 보내야 할지 모르겠다? 그러면 쓸 수 없는 것이다.
안 되는 예시)
- 반환 타입만 다른 경우: 함수의 반환 타입만 다르고 매개변수가 동일한 경우 오버로딩할 수 없다. 컴파일러는 호출된 함수의 반환 값을 기준으로 함수를 선택할 수 없기 때문이다.
- 값과 참조를 혼용한 경우: 매개변수가 값 타입과 참조 타입만 다른 경우에도 컴파일러가 어떤 함수를 선택할지 혼란스러울 수 있다.
- 디폴트 인수 사용 시: 디폴트 인수와 함수 오버로딩을 혼용할 경우, 호출 시 컴파일러가 어느 함수를 선택해야 할지 명확하지 않다면 사용이 불가능하다.
- 네임스페이스 충돌: 네임스페이스가 충돌할 경우에도 오버로딩이 불가능할 수 있지만, 이는 강제로 해결할 수 있는 경우도 있다.
2. 디폴트 인수
정의 - 기본값이 미리 정의되어 있는 인수를 의미한다.
함수를 호출할 때 인수를 전달하지 않으면, 함수는 자동으로 미리 정의되어 있는 디폴트 인수 값을 사용하게 된다.
예시)
#include <iostream>
int add(int n1, int n2 = 0);
int main()
{
printf("%d\n", add(1));
}
int add(int n1, int n2)
{
return n1 + n2;
}
위 코드에서는 n2에 디폴트 값 0이 설정되어 있기 때문에 add 함수 호출 시 n2 값을 제공하지 않으면 자동으로 0이 사용이 된다.
- add(1)을 호출하면 n2는 0으로 간주되어 1 + 0의 결과가 반환된다.
2.1 디폴트 함수 주의점
1. 중간에만 디폴트 값을 사용하는 경우는 불가능: 디폴트 인수는 오른쪽에서부터 순차적으로 정의해야 한다.
int add(int n1, int n2 = 0, int n3);
- 위의 예시에서는 n3에는 디폴트 값을 제공하지 않으면서 n2에는 디폴트 값을 제공하고 있는데 이런 경우 오류가 발생한다.
2. 공백란이 생기면 사용 불가 :
int add(int n1 = 0, int n2, int n3 = 0);
- 컴파일러는 인수를 오른쪽에서부터 읽어 나가기 때문에, 중간에 디폴트 값이 없는 인수(n2)가 있으면 어떤 값을 넣어야 할지 판단할 수 없습니다.
결론적으로, 디폴트 인수는 오른쪽부터 순차적으로 정의해야 하며, 그렇지 않으면 컴파일러가 올바르게 처리할 수 없어 오류가 발생하게 된다.
'C++' 카테고리의 다른 글
[강의] 10월 16일 수업정리 (1) | 2024.10.17 |
---|---|
[강의] 10월 15일 수업정리 (1) | 2024.10.16 |
[강의] 10월 10일 수업정리 (2) | 2024.10.11 |
[강의] 10월 4일 수업정리 (1) | 2024.10.05 |
[강의] 10월 2일 수업정리 (1) | 2024.10.03 |