함수 다중 정의
- Overloading = 다중 정의
- 다중정의 : 하나의 함수 이름이 여러 의미를 동시에 갖는 것을 말한다.
- 함수에서 다중 정의에 영향을 주는 것은 '매개변수'뿐이다.
반환형식만 다른 경우 또는 호출 규칙만 다른 경우는 다중 정의에 해당되지 않는다.
디폴트 매개변수와 다중 정의가 조합되면 발생되는 문제
void TestFun(int a){}
void TestFun(int a, int b=10){}
//이렇게 다중정의하는 것은 문제가 되지않지만
//"제작자는 오류를 경험하지 않지만 함수 사용자는 오류를 경험할 수 있다."
int _tmain(int argc, _TCHAR* argv[]){
TestFunc(5); //호출이 모호해서 컴파일 오류가 발생 //이 코드를 주석처리하면 오류는 발생하지 않음
return 0;
}
개발자 유의 사항
실력있는 프로그래머라면 자신이 만들어낸 함수나 객체를 사용하는 또 다른 개발자를 고려해야 한다는 점을 다시한번 강조하고 싶습니다. 심지어 사용자의 실수를 차단하기 위한 노력까지 해야합니다.
다중정의를 편하게 하기위한 함수 템플릿
- 다중정의를 하는 이유는 사용자의 편의성과 확장성을 얻을 수 있기 때문
- 사용자를 편하게 해주자고 제작자는 같은 일을 여러번 반복해야한다. 유지보수 측면에서더 심각한 문제
- C++에서는 가급적이면 함수 다중 정의보다는 '함수 템플릿'을 사용하길 권한다.
- 템플릿: 일종의 틀. 소스코드를 다중정의함수로 자동으로 생성하는 것.
>함수 템플릿 사용법
template <typename T> //일반 함수위에 이 구문을 붙이는 것, T 자료형을 사용하는 템플릿이라는 의미
반환형 fun(매개변수){ //매개변수로 넘어오는 변수의 자료형으로 T자료형이 결정된다.
}
사용예
template <typename T>
T TestFunc(T a){
std::cout << "매개변수 A: " << a << std::endl;
//cout객체는 알아서 변수 형식을 지정하지 않아도 출력이가능하므로,
//템플릿과 함께 사용하기 좋다.
return a;
}
int main(){
std::cout << TestFunc(3);
std::cout << TestFunc(3.3);
std::cout << TestFunc('A');
std::cout << TestFunc("TestString");
}
이렇게 호출자가 어떤 실인수로 TestFunc()함수를 호출하는가에 따라 컴파일러가
자동으로 자료형을 해석하여 다중 정의 함수가 생성된다.
만약 호출하지 않으면 함수가 생성되지 않는 것이다.
컴파일러가 인식하지 않고 바로 자료형을 지정해주려면 아래처럼 하면된다.
(컴파일러가 자료형을 인식하지 않아도돼서 더 빠를려나?)
std::cout << TestFunc<int>(3)
---------------------------------------------------------------------------
템플릿을 사용하지 않았을 경우 위 main코드를 사용하려면
아래처럼 같은 기능을하는 함수를 다 정의해줘야하는 번거로움이있다.
int TestFunc(int a)
double TestFunc(double a)
char TestFunc(char a)
string TestFunc(string a)
템플릿을 사용하면 같은일을 하는 코드가 여러 번 등장할 필요가 없어졌기 때문에 안정적인 구조라고 할 수 있다.
'◼️C++' 카테고리의 다른 글
[C++] 네임스페이스, using, 네임스페이스 중첩, 네임스페이스 다중정의 (0) | 2023.09.06 |
---|---|
[C++] 인라인 함수 (0) | 2023.09.05 |
[C++] 디폴트 매개변수 (0) | 2023.09.05 |
[C++] 소숫점 아랫자리 버리기. 정확하지 않은 실수 연산 해결하기 (0) | 2023.09.04 |
[C++] 범위 기반 for 문 for(auto n : nList) (0) | 2023.08.31 |