블록체인 학습
0 XP

함수 오버로딩

함수 오버로딩(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 처럼 이름을 나누는 편이 더 나을 때도 많습니다.

Code Editor
에디터를 불러오는 중...
실행 결과

Run 버튼을 눌러 코드를 실행하세요.