# Solidity Interface

By [Primrose](https://paragraph.com/@primrose) · 2023-06-07

---

Interface
=========

**인터페이스는 다른 컨트랙트와 상호작용하기 위해 사용된다.**

자식 컨트랙트를 위한 틀이며, 추상 함수로만 구성되어야 한다.

해당 내용을 구현하지는 않고 이를 상속하는 쪽에서 구현하게 하되, 다른 컨트랙트들에게 이 컨트랙트는 이런 함수들을 포함하니 안심하고 호출하라는 정보를 주는 역할을 한다.

Interface in Solidity
=====================

아래는 간단한 인터페이스 예시이다.

`ICalculator`를 이용해서 계산기에 대한 인터페이스를 만들었고, `contract Calculator is ICalculator` 구절은 Calculator 컨트랙트가 해당 인터페이스를 상속받도록 만든다.

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.9;
    
    interface ICalculator {
        function Add(uint256 a, uint256 b) external pure returns (uint256 result);
    
        function Sub(uint256 a, uint256 b) external pure returns (uint256 result);
    
        function Div(uint256 a, uint256 b) external pure returns (uint256 result);
    
        function Mul(uint256 a, uint256 b) external pure returns (uint256 result);
    }
    
    contract Calculator is ICalculator {
        function Add(uint256 a, uint256 b) external pure returns (uint256 result) {
            result = a + b;
        }
    
        function Sub(uint256 a, uint256 b) external pure returns (uint256 result) {
            result = a - b;
        }
    
        function Div(uint256 a, uint256 b) external pure returns (uint256 result) {
            result = a / b;
        }
    
        function Mul(uint256 a, uint256 b) external pure returns (uint256 result) {
            result = a * b;
        }
    }
    

만약에 상속받는 컨트랙트가 여러 개가 된다면 어떻게 할까?

아래와 같이 작성할 수 있다.

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.9;
    
    interface ICalculator {
        function Add(uint256 a, uint256 b) external pure returns (uint256 result);
    
        function Sub(uint256 a, uint256 b) external pure returns (uint256 result);
    
        function Div(uint256 a, uint256 b) external pure returns (uint256 result);
    
        function Mul(uint256 a, uint256 b) external pure returns (uint256 result);
    }
    
    interface IGetter {
        function Get() external view returns (uint256 result);
    }
    
    contract Calculator is ICalculator, IGetter {
        uint256 data = 10;
    
        function Add(uint256 a, uint256 b) external pure returns (uint256 result) {
            result = a + b;
        }
    
        function Sub(uint256 a, uint256 b) external pure returns (uint256 result) {
            result = a - b;
        }
    
        function Div(uint256 a, uint256 b) external pure returns (uint256 result) {
            result = a / b;
        }
    
        function Mul(uint256 a, uint256 b) external pure returns (uint256 result) {
            result = a * b;
        }
    
        function Get() external view returns (uint256 result) {
            return data;
        }
    }
    

그렇다면 한 걸음 더 나아가서, 같은 메소드를 가진 두 개의 인터페이스를 상속받는 경우에는 어떻게 처리해야 할까?

아래와 같이 override로 명시해줌으로써 상속을 받아 구현할 수 있다.

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.9;
    
    interface ICalculator {
        function Add(uint256 a, uint256 b) external pure returns (uint256 result);
    
        function Sub(uint256 a, uint256 b) external pure returns (uint256 result);
    
        function Div(uint256 a, uint256 b) external pure returns (uint256 result);
    
        function Mul(uint256 a, uint256 b) external pure returns (uint256 result);
    }
    
    interface IGetter {
        function Get() external view returns (uint256 result);
    }
    
    interface ICalculatorTwo {
        function Add(uint256 a, uint256 b) external pure returns (uint256 result);
    
        function Sub(uint256 a, uint256 b) external pure returns (uint256 result);
    
        function Div(uint256 a, uint256 b) external pure returns (uint256 result);
    
        function Mul(uint256 a, uint256 b) external pure returns (uint256 result);
    }
    
    contract Calculator is ICalculator, IGetter, ICalculatorTwo {
        uint256 data = 10;
    
        function Add(
            uint256 a,
            uint256 b
        )
            external
            pure
            override(ICalculator, ICalculatorTwo)
            returns (uint256 result)
        {
            result = a + b;
        }
    
        function Sub(
            uint256 a,
            uint256 b
        )
            external
            pure
            override(ICalculator, ICalculatorTwo)
            returns (uint256 result)
        {
            result = a - b;
        }
    
        function Div(
            uint256 a,
            uint256 b
        )
            external
            pure
            override(ICalculator, ICalculatorTwo)
            returns (uint256 result)
        {
            result = a / b;
        }
    
        function Mul(
            uint256 a,
            uint256 b
        )
            external
            pure
            override(ICalculator, ICalculatorTwo)
            returns (uint256 result)
        {
            result = a * b;
        }
    
        function Get() external view returns (uint256 result) {
            return data;
        }
    }

---

*Originally published on [Primrose](https://paragraph.com/@primrose/solidity-interface)*
