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) 처럼 반드시 명시해야 합니다.