interface vs abstract 비교
인터페이스와 추상 컨트랙트는 둘 다 "완성되지 않은 틀"을 제공하지만, 쓰임새와 제약이 다릅니다.
외부 컨트랙트와의 약속이 필요하면 interface, 공통 코드를 물려주는 기반 클래스가 필요하면
abstract contract 를 선택하세요.
interface 와 abstract 의 차이
| 항목 | interface | abstract contract |
|---|---|---|
함수 구현 | 불가능 | 일부 가능 |
| 상태 변수 | 불가능 | 가능 |
| 생성자 | 불가능 | 가능 |
| 함수 가시성 | 모두 external | 자유 |
| 용도 | 외부와의 표준 약속 | 공통 로직 상속용 기반 |
어느 쪽을 고를지 정하는 기준
- 다른 컨트랙트를 호출해야 하는데 그 구현을 몰라도 될 때 →
interface. 예) 임의의 ERC-20 토큰을 다루는 거래소 컨트랙트. - 여러 자식 컨트랙트가 코드를 공유하면서 일부만 다르게 동작해야 할 때 →
abstract. 예) 공통 소유권 로직(owner)을 물려주고withdraw만 자식이 채우는 기반 컨트랙트.
핵심 차이는 상태입니다. 인터페이스는 변수를 한 줄도 둘 수 없는 순수한 약속이지만, 추상 컨트랙트는 상태 변수와 생성자를 가진 "반쯤 완성된 부모"입니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
// interface: 약속만 (상태 변수 X, 구현 X, 모두 external)
interface IPayable {
function pay() external payable;
}
// abstract: 공통 상태 + 일부 구현 + 미구현 함수
abstract contract BaseAccount {
address public owner;
constructor() {
owner = msg.sender;
}
function isOwner(address who) public view returns (bool) {
return who == owner;
}
// 미구현 함수: 자식이 완성
function withdraw() public virtual;
}실무에서는 둘을 함께 쓰는 경우도 많습니다. 외부 표준은 interface 로 선언하고, 그 표준을 부분
구현한 abstract 기반 컨트랙트를 만든 뒤, 최종 컨트랙트가 이를 상속해 완성하는 구조입니다.