프로시저와 함수 오버로드

같은 유효 범위(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 15775
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 14184
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16738
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22297
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23613
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 19127
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39568
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174991
20 이 달의 기술자료 - 2018년 03월 file 험프리 2018.02.23 778
19 3가지 API 이야기: VCL에서 WinAPI, COM&ShellAPI, WinRT 활용하기 관리자 2019.09.18 737
18 엠바카데로 오픈 소스 프로젝트 관리자 2020.05.25 714
17 델파이 개발자 관점에서 본 윈도우 개발 file 김원경 2020.03.13 714
16 C++빌더/델파이 개발자를 위한 최적의 데이터베이스 관리 도구 - 아쿠아 데이터 스튜디오 file 관리자 2018.12.11 664
15 올 해의 기술자료 TOP 10 - 개발자들이 가장 많이 클릭한 기술자료는? 관리자 2018.10.24 594
14 엔터프라이즈 커넥터로 VCL 애플리케이션에서 '구글 시트' 데이터 조회 및 편집하기 험프리 2019.10.04 580
13 [업데이트][핫픽스][10.2.2] RTL 호환성패치 및 안드로이드 애니메이션 문제 해결 - 2018년 2월 패치 file 험프리 2018.02.20 574
12 MS 비주얼 스튜디오 C++을 C++빌더와 함께 활용하기 관리자 2020.03.12 546
11 이 달의 기술자료 - 2017년 09월 file 험프리 2017.09.01 539
10 RAD스튜디오 2020 로드맵 – 자세한 내용을 확인해보세요! (PM들의 코멘터리) 관리자 2020.11.19 525
9 이 달의 기술자료 - 2018년 06월 file 험프리 2018.05.25 515
8 이 달의 기술자료 - 2020년 12월 험프리 2020.11.26 370
7 이 달의 기술자료 - 2019년 07월 험프리 2019.06.28 352
6 이 달의 기술자료 - 2020년 04월 험프리 2020.03.27 291
5 [업데이트][핫픽스][10.3] C++툴체인 핫픽스 험프리 2019.01.25 278
4 이 달의 기술자료 - 2020년 03월 file 험프리 2020.02.28 277
3 이 달의 기술자료 - 2020년 02월 험프리 2020.01.31 265
2 [업데이트][패치][10.3.3] Midas와 델파이 Open Array 패치 험프리 2020.02.28 262
1 [엠바카데로 Feature Friday][개발팁] VCL 멀티-컬럼 리스트박스 관리자 2019.06.28 235