c에서 c++로 넘어오면서 생긴 가장 획기적인 기능 중 하나는 오버로딩이 아닐까 싶다.



오버로딩(Overloading)이란?


overload -> 과부하. 초과적재.

너무 짐을 많이 싣다(load to excess), 지나치게 부담시키다(over-burden)


사전적 의미는 이와같다.


오버로딩은 하나의 이름의 함수를 여러기능으로 정의하는 것이다.

즉 같은 이름으로 다른 기능을 하는 함수를 만들어내는 것이다.


조금만 생각해보면 왜 같은 이름으로 다른 기능을 할 필요가 있지? 다른 이름으로 다른 기능을 하면 될텐데? 라는 생각이 들 수 있을 것이다. 현실 세계에서 같은 이름인 친구가 있다면, 불편할 뿐이지 편하진 않다. 하지만 프로그래밍 세계에서는 무척 도움이 된다.


프로그램은 세부적인 단위로 따져가며 모호함을 기피하는데, 그로 인한 불편이 크다.

예를 들어



atoi와 atof의 차이점은 자료형이다.


그 뿐만이 아니라.. atoi64를 생각해보자.

atof야 자료형이 다르면 기능도 다르다고 생각해야 할 수 있다. 그러나..

atoi64면 나중에 128bit 자료형이 나오면 atoi128 그 다음엔 256.. 이렇게 써야한단 말인가?


따지는 게 많은 컴파일러는 각 자료마다도 다르게 평가하기 때문에..

만약 우리가 덧셈 함수를 만들어야한다면

float과 float의 연산

int와 int의 연산

int와 float의 연산

심지어 float과 int의 연산..


이 각각의 차이마다 대응해주어야한다.


기능은 비슷하니 구현을 여러개 하는 것은 둘째치고.. 이쯤되면 작명도 힘들다.

plusff;

plusii;

plusif;

plusfi;


이런식으로 끊임없이 늘려가면 구현하는 사람도 힘들고 사용하는 사람은 더 불편하다.


그것을 '같은 이름'으로 전혀 상관이 없더라도 다른 기능을 할 수 있게 해준 것이 오버로딩이다.


단 몇가지 제약이 있는데, 두 함수는 같은 이름이되.. 같은 함수로 보이면 안된다는 것이다.


리턴 타입(반환 값), 그리고 내부 구현 다르건 같건 상관 없지만 시그니쳐(매개변수들)는 달라야한다.




그냥 똑같은 녀석 두개를 정의하는 건 안된다. 어디까지나 오버로딩은 '같은 이름'으로 다른 기능을 하는 녀석들을 만드는 개념이다.




이처럼 float과 int 인 녀석으로 바꾸었더니 잘 된다. 물론 호출 시에는 둘 다 add로 사용하고 있다.




'같은 이름'으로 다른 기능을 시킬 뿐이므로, 극단적으로는 이와 같은 것도 가능하다.

모호하지만 않으면 된다.



리턴 타입이 다르니까 다르겠지? 라는 생각이 들 수 있지만, 리턴 타입의 차이 같은 건 컴파일러가 전혀 신경쓰지 않는다.




오버로딩이 불가능한 상황.


1. 리턴 타입만 다른 경우. (모호함에 의해 불가하다)

2. 레퍼런스 변수와 일반 변수의 호출이 모호할 경우.

3. const로 선언한 것과 아닌 것이 다른 것들은 경우.

4. 인수에 논리적 정의만 다른 경우 (형식인수와 실 인수의 이름만 다른 경우)

5. 디폴트 인수의 생략에 의해서 호출이 모호할 경우.




Posted by GENESIS8

댓글을 달아 주세요