함수 오버로딩
함수 오버로딩(function overloading) 은 같은 이름의 함수를 매개변수 구성이 다르게 여러 개 정의하는 것입니다. 하나의 이름으로 비슷한 동작을 묶되, 입력의 형태에 따라 다르게 처리하고 싶을 때 유용합니다. 컴파일러는 호출 시 전달된 인자의 개수와 타입을 보고 어떤 함수를 실행할지 스스로 결정합니다.
매개변수 개수가 다른 오버로딩
가장 흔한 형태는 매개변수의 개수를 다르게 하는 것입니다.
contract Adder {
// 두 수를 더하는 함수
function add(uint256 a, uint256 b) public pure returns (uint256) {
return a + b;
}
// 같은 이름이지만 매개변수가 세 개인 함수
function add(uint256 a, uint256 b, uint256 c) public pure returns (uint256) {
return a + b + c;
}
}add(1, 2) 를 호출하면 첫 번째 함수가, add(1, 2, 3) 을 호출하면 두 번째 함수가 실행됩니다.
매개변수 타입이 다른 오버로딩
개수가 같아도 타입이 다르면 오버로딩이 성립합니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Printer {
function describe(uint256 value) public pure returns (uint256) {
return value;
}
// 같은 이름, 같은 개수지만 타입이 string 이라 별개의 함수
function describe(string memory value) public pure returns (string memory) {
return value;
}
}반환 타입만 다르고 매개변수가 같으면 오버로딩할 수 없습니다. 매개변수의 개수나 타입이 반드시
달라야 합니다. 시그니처(함수 이름 + 매개변수 타입 목록) 가 같으면 컴파일 오류가 납니다.
모호한 호출 주의
오버로딩이 있을 때, 인자가 여러 함수에 동시에 맞을 수 있으면 컴파일러는 어느 것을 부를지 결정하지 못해 오류를 냅니다.
예를 들어 uint8 과 uint256 두 버전을 만들고 작은 리터럴을 넘기면 모호해질 수 있습니다. 이럴 때는 인자를 명시적으로 형 변환하거나, 오버로딩 대신 이름을 구분해 설계하는 편이 안전합니다.
오버로딩은 편리하지만 남용하면 코드가 읽기 어려워집니다. 의미가 분명히 다른 동작이라면 addTwo, addThree 처럼 이름을 나누는 편이 더 나을 때도 많습니다.