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 |