Solidity에서 상속(inheritance)인터페이스(interface)는 매우 강력한 조합입니다. 이 둘을 함께 사용하면 코드의 재사용성, 유연성, 표준화, 확장성이 훨씬 높아집니다.

🧩 1. 기본 개념: 상속 + 인터페이스 조합

요소 설명
인터페이스 (interface) 함수 시그니처만 정의 → 구현은 자식 컨트랙트에서
상속 (inheritance) 부모 컨트랙트의 구현/상태 변수까지 상속
조합 사용 이유 구조는 interface로 명세 + 기능은 상속으로 재사용

📘 실전 구조 예시

🧱 인터페이스 정의

// IStaking.sol
interface IStaking {
    function stake(uint256 amount) external;
    function withdraw(uint256 amount) external;
    function totalStaked() external view returns (uint256);
}

🏗️ 기능 구현 컨트랙트 (베이스 로직)

// BaseStaking.sol
abstract contract BaseStaking {
    mapping(address => uint256) internal stakes;
    uint256 internal _totalStaked;

    function _stake(address user, uint256 amount) internal {
        stakes[user] += amount;
        _totalStaked += amount;
    }

    function _withdraw(address user, uint256 amount) internal {
        require(stakes[user] >= amount, "Not enough stake");
        stakes[user] -= amount;
        _totalStaked -= amount;
    }

    function _getTotalStaked() internal view returns (uint256) {
        return _totalStaked;
    }
}

✅ 최종 컨트랙트: 인터페이스 + 기능 상속

// MyStaking.sol
import "./IStaking.sol";
import "./BaseStaking.sol";

contract MyStaking is IStaking, BaseStaking {
    function stake(uint256 amount) external override {
        _stake(msg.sender, amount);
    }

    function withdraw(uint256 amount) external override {
        _withdraw(msg.sender, amount);
    }

    function totalStaked() external view override returns (uint256) {
        return _getTotalStaked();
    }
}

✅ 정리: 조합 사용의 장점

장점 설명
표준화 interface로 외부에 명세 제공 (IERC20, IERC721 등과 동일)
코드 재사용 베이스 컨트랙트로 로직 공유
테스트 용이성 mock interface 구현 가능
유연성 다형성(polymorphism) 구현 가능

🧠 팁: interface + abstract contract + 구현 contract

Solidity에서는 아래처럼 3단 구조를 사용하는 것이 일반적입니다:

interface ILogic ← 명세만
abstract BaseLogic ← 내부 로직, 상태 변수, modifier
contract MyLogic ← 상속 + 실제 구현

예: OpenZeppelin의 IERC20, ERC20, MyToken

🔍 인터페이스 vs 추상 계약 차이

|항목| interface| abstract contract|
|함수 구현| ❌ 불가능| ✅ 일부 구현 가능|
|상태 변수| ❌ 불가능| ✅ 선언/사용 가능|
|목적| 외부 명세| 베이스 로직 공유|
|예시| IERC20| ERC20|

✅ 요약

조합 구조 설명
interface 사용자가 기대하는 “API” 정의
abstract contract 내부 로직 캡슐화, 재사용
contract 실제 동작 구현, 배포 대상

'Solidity' 카테고리의 다른 글

연결 리스트 구현 개선  (0) 2025.03.26
Solidity 로 연결 리스트 구현하기  (0) 2025.03.26
Solidity 에서의 상속  (0) 2025.03.25
solidity 의 hash table  (0) 2025.03.25
스마트 컨트랙트 오류 핸들링  (0) 2025.03.20

+ Recent posts