프로시저와 함수 오버로드

같은 유효 범위(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 22591
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 21024
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 23082
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 28881
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 30050
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 25397
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 46348
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 182316
1397 N 윈도우와 맥 개발 시작을 위한 파이어몽키 코스북: 무료 다운로드 제공(385페이지) 관리자 2013.04.05 152367
1396 ComPort(시리얼 통신) 컴포넌트 설치안내 [11] file 험프리 2013.12.04 112779
1395 [REST API] REST 기반 파일 업로드와 다운로드 구현하기 험프리 2020.08.31 84736
1394 델파이 튜토리얼 자습서 이용 안내 관리자 2014.09.01 71988
1393 이 달의 기술자료 - 2014년 11월 험프리 2014.10.13 54176
1392 이 달의 기술자료 - 2014년 6월 file 험프리 2014.06.05 50404
1391 Find the O/S Language Type c2design 2014.07.30 48421
1390 RAD Studio Resource Center 박병일 2012.01.26 46645
1389 CD-ROM 열고 닫기 박병일 2011.12.22 44787
1388 [Android] 폰번호 가져오기 [1] 타락천사 2014.09.05 38644
1387 이 달의 기술자료 - 2014년 12월 file 험프리 2014.11.26 32514
1386 RAD Studio XE6 Update1 발표 [1] Humphery 2014.06.20 29499
1385 델파이XE2 파이어몽키 기반 아이폰앱 개발에서 제스춰를 인식시키는 방법 박병일 2012.01.25 23342
1384 [10.4 시드니 신기능] 새로운 VCL TEdgeBrowser 컴포넌트 험프리 2020.05.18 23197