블록체인 학습
0 XP

interface vs abstract 비교

인터페이스와 추상 컨트랙트는 둘 다 "완성되지 않은 틀"을 제공하지만, 쓰임새와 제약이 다릅니다.

외부 컨트랙트와의 약속이 필요하면 interface, 공통 코드를 물려주는 기반 클래스가 필요하면 abstract contract 를 선택하세요.

interface 와 abstract 의 차이

항목interfaceabstract 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 기반 컨트랙트를 만든 뒤, 최종 컨트랙트가 이를 상속해 완성하는 구조입니다.

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

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