프로시저와 함수 오버로드

같은 유효 범위(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 15405
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13957
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16493
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22044
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23266
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18920
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39241
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174691
110 Developer Direct LIVE! 모바일 썸머 스쿨!! 관리자 2013.07.06 2954
109 [기술백서] 모바일로 가면서 개발자가 하게 되는 실수 TOP5 (한글) 관리자 2013.07.06 4318
108 TListView iOS 샘플 제공 관리자 2013.06.28 4024
107 아이폰, 아이패드, 아이팟 앱 개발을 위한 파이어몽키 용 TMS 컴포넌트가 출시되었습니다. 관리자 2013.06.04 3786
106 IOS 앱을 개발하여 App Store에 등록하는 방법 관리자 2013.05.20 5405
105 델파이XE4로 아이폰, 아이패드, 윈32, 윈64, 맥OS X 단일 소스코드 베이스로 2분만에 개발 관리자 2013.05.13 5602
104 Delphi XE4에서 iOS 개발 환경 구축시 유의 할점. c2design 2013.05.11 5384
103 [웹세미나 안내] 델파이를 활용한 멀티-디바이스 앱 개발 관리자 2013.03.29 4636
102 멀티-티어 작업을 더욱 쉽게 만들어주는 Class Helper 관리자 2013.03.26 5000
101 델파이로 간단하게 슬라이드 효과를 적용한 iOS앱 만들기 관리자 2013.03.26 4957
100 [델파이 문법] 데이터 타입, 변수 및 상수 #4 file 관리자 2013.02.19 6373
99 [델파이 문법] 데이터 타입, 변수 및 상수 #3 file 관리자 2013.02.13 6735
98 [델파이 문법] 데이터 타입, 변수 및 상수 #2 file 관리자 2013.02.04 8230
97 [델파이 문법] 데이터 타입, 변수 및 상수 #1 관리자 2012.12.25 6980
96 [델파이 문법] 문법 요소 #15 file 관리자 2012.12.25 5392
95 델파이/C++빌더/RAD Studio XE3 업데이트1 다운로드 및 보완사항 리스트 관리자 2012.12.21 5193
94 [델파이 문법] 문법 요소 #14 file 관리자 2012.12.17 5357
93 [웹 세미나] RAD 따라잡기: 윈도우8 스타일 관리자 2012.11.27 4488
92 CodeRage7 : '델파이' 다시보기 관리자 2012.11.24 5261
91 [델파이 문법] 문법 요소 #13 file 관리자 2012.11.20 6107