블록체인 학습
0 XP

interface 선언 문법

인터페이스를 선언할 때는 지켜야 할 규칙이 몇 가지 있습니다. 인터페이스는 "순수한 약속"이어야 하므로, 일반 컨트랙트에서 쓰던 요소 상당수가 금지됩니다.

인터페이스의 모든 함수는 반드시 external 가시성이어야 하며, 구현(본문)을 가질 수 없습니다. 또한 상태 변수, 생성자, modifier 도 둘 수 없습니다.

무엇이 되고 무엇이 안 되나

  • 모든 함수는 external 이어야 한다. (public·internal·private 불가)
  • 함수 본문이 없다. 항상 ; 로 끝난다.
  • 상태 변수를 선언할 수 없다. (인터페이스는 데이터를 저장하지 않는다)
  • 생성자(constructor) 와 modifier 도 둘 수 없다.
  • enum, struct, event, 그리고 커스텀 에러는 선언할 수 있다.
  • 다른 인터페이스를 상속(is)할 수 있다.

함수가 모두 external 인 이유는, 인터페이스가 본래 외부 호출(다른 컨트랙트·EOA가 호출)을 표준화하기 위한 도구이기 때문입니다. 같은 컨트랙트 내부에서만 쓰는 internal 함수는 약속의 대상이 아닙니다.

인터페이스 구현하기

인터페이스를 따르는 컨트랙트는 is 로 상속한 뒤, 약속된 모든 함수를 빠짐없이 구현 해야 합니다. 하나라도 빠지면 그 컨트랙트는 abstract 가 되어 배포할 수 없습니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
interface IToken {
    // 인터페이스 안에서는 event 선언이 허용됩니다.
    event Transfer(address indexed from, address indexed to, uint256 value);
 
    function transfer(address to, uint256 amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
}
 
// 인터페이스를 구현하는 컨트랙트는 모든 함수를 구현해야 합니다.
contract MyToken is IToken {
    mapping(address => uint256) public balances;
 
    function transfer(address to, uint256 amount) external returns (bool) {
        balances[msg.sender] -= amount;
        balances[to] += amount;
        emit Transfer(msg.sender, to, amount);
        return true;
    }
 
    function balanceOf(address account) external view returns (uint256) {
        return balances[account];
    }
}

Solidity 0.8.8 부터는 인터페이스 함수 하나만 구현하는 함수라면 override 키워드를 생략할 수 있습니다. (인터페이스 함수는 0.6.0 부터 자동으로 virtual 로 취급되지만, 0.8.8 이전에는 그래도 override 를 붙여야 했습니다.) 단, 여러 기반 컨트랙트가 같은 함수를 정의하는 경우에는 override(A, B) 처럼 반드시 명시해야 합니다.

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

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