프로시저와 함수 오버로드

같은 유효 범위(scope) 내에서 둘 이상의 루틴을 같은 이름으로 선언할 수 있습니다. 이를
오버로드(overload)라고 합니다. 오버로드된 루틴은 overload 지시어로 선언해야 하여 파
라미터 리스트로 구분합니다. 예를 들어, 다음의 선언들을 살펴봅시다.

1.png

위 코드에서는 Divide라는 이름을 가진 함수를 두 개 만드는데, 두 함수는 파라미터 타입이
다릅니다. Divide를 호출하면 컴파일러는 호출에서 전달된 실제 파라미터들을 봐서 둘 중
어떤 함수를 호출할 지를 결정합니다. 예를 들어, Divide(6.0, 3.0)는 해당 인수가 실수이기
때문에 첫 번째 Divide 함수를 호출합니다.

오버로드된 루틴에 그 루틴 선언들의 파라미터들과 타입이 동일하지 않은 파라미터들을 전
달할 수 있지만, 파라미터와 대입 호환이 가능한 파라미터들을 가진 루틴이 있어야 합니다.
이는 루틴이 여러 정수 타입이나 실수 타입으로 오버로드될 때 가장 자주 발생합니다.

2.png

이 경우, 모호함 없이 가능하다면, 컴파일러는 호출 시 넘겨진 파라미터를 포함하면서 타입
범위가 가장 작은 파라미터가 있는 루틴을 호출합니다. (실수 타입의 상수 표현식은 항상
Extended 타입이라는 것을 기억하십시오.)

오버로드된 루틴은 파라미터의 수 또는 파라미터의 타입으로 구별될 수 있어야 합니다. 따
라서 다음의 두 선언들은 컴파일 에러를 일으킵니다.

3.png

그러나 다음과 같은 선언은 적합합니다.

4.png

오버로드된 루틴들이 forward 선언 또는 interface 선언에서 선언되면 정의적 선언에서는
반드시 루틴의 파라미터 리스트를 지정해야 합니다.

컴파일러는 같은 파라미터 위치에 string(UnicodeString)을 포함하는 함수, AnsiString을
포함하는 함수, 그리고 WideString을 포함하는 함수가 오버로드되어 있을 때 이들을 구별
할 수 있습니다. 이렇게 오버로드된 상황에서 전달된 문자열 상수나 리터럴은 네이티브 문
자열 타입, 즉 string(UnicodeString)으로 해석됩니다. PChar(PWideChar)를 포함하는
함수와 PAnsiChar를 포함하는 함수가 오버로드되어 있을 경우에도 마찬가지로 네이티브
문자 타입인 PChar (PWideChar)으로 해석됩니다.

5.png

variant 타입도 오버로드된 함수 선언들에서 파라미터로 사용될 수 있습니다. variant는 모
든 단순 타입들보다 더 일반적인 것으로 간주됩니다. variant 타입보다는 정확하게 타입이
일치하는 함수가 항상 선택됩니다. variant 타입의 표현식이 이런 오버로드된 상황에서 파
라미터로 전달되고, 또 그 파라미터 위치에 variant를 파라미터로 받는 오버로드된 함수가
존재할 경우, variant 타입으로 정확하게 일치하는 것으로 간주됩니다.

이것은 실수 타입들을 다룰 때 작은 부작용을 일으킬 수 있습니다. 실수 타입들은 크기로 매
치됩니다. 오버로드 호출로 전달된 실수 변수에 해당하는 정확하게 일치하는 루틴이 없고,
variant 파라미터를 가진 오버로드 함수가 있다면, 더 작은 실수 타입의 파라미터를 가진
루틴보다는 variant 파라미터를 가진 루틴이 선택됩니다.

다음 예를 살펴봅시다.

6.png

이 예제에서 double 버전의 foo가 아니라 variant 버전의 foo가 호출됩니다. 이것은 상수
1.2는 암시적으로 extended 타입이고, extended 타입은 double 타입과 정확하게 일치하지
않기 때문입니다. extended는 variant와도 정확히 일치하지는 않지만, variant는 더 일반
적인 타입으로 간주되기 때문입니다.(반면 double은 extended보다 작은 타입입니다.)

7.png

이런 타입 캐스트는 가능하지 않습니다. 대신 타입 지정 상수(typed constant)를 사용하면
됩니다.

8.png

위의 코드는 정확하게 동작하며, double 버전을 호출합니다.

9.png

위의 코드도 역시 double 버전의 foo를 호출합니다. single은 variant보다 double에 더 잘
맞기 때문입니다.

오버로드된 루틴들을 선언할 때, 실수가 variant로 바뀌어버리는 문제를 피하는 가장 좋은
방법은 variant 버전과 함께 각각의 실수 타입마다(Single, Double, Extended) 오버로드
된 함수를 선언하는 것입니다.

오버로드된 루틴에서 기본 파라미터(default parameter)를 사용한다면 파라미터 리스트가
모호해지지 않도록 주의하십시오. 자세한 내용은“기본 파라미터와 오버로드된 루틴”을 참
조하십시오.

호출할 때 루틴의 이름을 한정하여 오버로드의 잠재적인 효과를 제한할 수 있습니다. 예를
들어, Unit1.MyProcedure(X, Y)는 Unit1에서 선언된 루틴만 호출할 수 있습니다. Unit1
에 호출의 이름 및 파라미터 리스트와 일치하는 루틴이 없으면 에러가 발생합니다.

클래스 계층 구조에서 오버로드된 메소드 구별에 대한 자세한 내용은 6장의“메소드 오버로
드”를 참조하십시오. DLL에서 오버로드된 루틴 엑스포트에 대한 자세한 내용은 10장의
“exports 절”을 참조하십시오.

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 14387
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13023
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 15532
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 21064
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 22297
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 17933
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 38228
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 173741
1163 David I의 31일 동영상(한글자막) - 새로운 장비와 센서를 적용한 파이어몽키 애플리케이션 관리자 2013.03.12 5644
1162 David I의 31일 동영상(한글자막) - dbExpress와 ClientDataSet으로 SQL데이터베이스를 활용한 파이어몽키 앱 만들기 관리자 2013.03.26 5637
1161 [델파이 문법] 문법 요소 #5 file 관리자 2012.10.22 5632
1160 [델파이 문법] 프로시저와 함수 #12 file 관리자 2012.08.30 5626
1159 David I의 31일 동영상(한글자막) - 오디오 재생 및 캡쳐앱 만들기(윈도우&맥용) 관리자 2013.04.04 5622
1158 David I의 31일 동영상(한글자막) - 두 개의 비디오 카메라로 화면 캡쳐하는 앱 만들기(윈도우&맥용) 관리자 2013.04.04 5619
1157 델파이XE4로 아이폰, 아이패드, 윈32, 윈64, 맥OS X 단일 소스코드 베이스로 2분만에 개발 관리자 2013.05.13 5599
1156 Form에 있는 콤포넌트를ListView 로 나타내기 박병일 2011.12.22 5587
1155 David I의 31일 동영상(한글자막) - 메트로폴리스 UI를 적용한 파이어몽키 애플리케이션 관리자 2013.03.12 5560
1154 20121204 C++빌더XE3 세미나 자료 file 관리자 2012.12.05 5547
1153 RAD Studio, Delphi 그리고 C++빌더 로드맵 - 한글(2014년 3월) file Humphery 2014.03.05 5541
1152 안드로이드 개발환경 추가 조치방법 - RAD Studio에서 SDK 설정 Humphery 2015.10.01 5533
1151 [델파이 문법] 프로시저와 함수 #8 file 관리자 2012.08.16 5533
» [델파이 문법] 프로시저와 함수 #5 file 관리자 2012.08.06 5533
1149 David I의 31일 동영상(한글자막) - HD비디오 재생 및 캡쳐하는 애플리케이션 만들기(윈도우&맥): 수정완료 관리자 2013.03.26 5528
1148 [C++빌더 XE3 비디오 31] C++빌더XE3로 Win32, Win64, OSX용 애플리케이션 만들기 관리자 2013.01.03 5516
1147 [델파이 문법] 프로시저와 함수 #6 file 관리자 2012.08.09 5512
1146 [C++빌더 XE3 비디오 31] C++ 파이어몽키 앱에 Action 및 Gesture 추가하기 관리자 2013.01.08 5497
1145 델파이 아래 버전에서 XE2로 마이그레이션시 별도의 리소스 파일이 필요 없는 경우 관리자 2012.07.05 5489
1144 [따라하기] 인공지능 오목게임(1) - 만들기 [2] file 대화마을 2017.09.12 5488