프로시저와 함수 오버로드

같은 유효 범위(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 15468
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13972
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16505
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22061
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23273
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18933
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39266
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174728
130 [마이그레이션] 64비트 적용 시 검토할 사항들 file 험프리 2017.02.08 3389
129 Release Notes for XE5 Update 1 c2design 2013.10.29 3380
128 CodeRage 8: Delphi 온라인 무료 세미나 개최 관리자 2013.10.15 3362
127 [추가된 문법 정리] - 배열 상수 초기화:델파이 XE7 추가 관리자 2016.06.03 3329
126 XE7에서 추가 된 안드로이드 프로젝트에서 외부 라이브러리(jar) 사용을 위한 정보 [1] Humphery 2014.11.03 3226
125 QR/바코드 스캐너 앱 샘플코드(ZXing, TFrameStand 사용) [1] 험프리 2017.08.04 3050
124 Developer Direct LIVE! 모바일 썸머 스쿨!! 관리자 2013.07.06 2954
123 브레이크 포인트를 설정해도 디버깅이 안되는 경우 살펴볼 항목 file 험프리 2016.05.13 2814
122 [따라하기] 도서대여 프로그램 만들기 - 5, 도서대여 기능 개발 file 험프리 2017.02.02 2809
121 엔터프라이즈 데이터 기반의 모바일 앱 과정(2일) 우선 등록 안내 관리자 2013.11.21 2720
120 [델파이7 이후 새로운 기능] 코딩 생산성을 높여주는 코드에디터 기능들 Humphery 2015.04.21 2696
119 [10.3 리오] 델파이 언어의 새로운 변화: 인라인 변수 선언 관리자 2018.11.12 2674
118 블루투스 바코드 스캐너(BI-07) 안드로이드 라이브러리를 델파이에서 연동하는 방법 [1] file 험프리 2017.03.24 2661
117 델파이, 25년의 혁신 - 버전 1부터 10.3까지 버전별 핵심 기능 [2] 관리자 2020.05.12 2643
116 델파이 문법을 익힐 수 있는 문서모음 [2] Humphery 2014.11.03 2635
115 델파이를 이용해 구글크롬캐스트와 연결 Humphery 2014.07.22 2627
114 [XE7] Castalia로 델파이 코딩 생산성을 높일 수 있습니다.(XE7사용자 무료제공) Humphery 2014.12.09 2601
113 [따라하기] 도서대여 프로그램 만들기 - 2, 메인화면 개발 [2] file 험프리 2017.01.26 2442
112 델파이 개체를 메모리에서 해제할 때 Free와 FreeAndNil의 차이점 김원경 2017.02.01 2419
111 [마이그레이션] 함수(또는 변수)에 빨간밑줄이 가고 컴파일 시 Undeclared Identifier 오류 시 조치방법 file 험프리 2015.09.30 2368