---
title: "Solidity contract interface란 무엇인가?"
description: "Solidity의 스마트 컨트랙트 인터페이스에 대해 알아야 할 모든 것"
---

# Solidity contract interface란 무엇인가?

**[Solidity](https://www.alchemy.com/overviews/solidity)**는 스마트 컨트랙트를 구현하기 위한 객체 지향 고급 언어입니다. [Solidity로 스마트 컨트랙트를 작성](https://www.alchemy.com/overviews/solidity-smart-contract)하다 보면, 다른 스마트 컨트랙트와 상호작용하기 위해 인터페이스를 사용해야 할 때가 있습니다. 인터페이스 사용법을 알면 Solidity 언어에 대한 이해를 높일 수 있고, 만들어볼 만한 다른 흥미로운 Solidity 스마트 컨트랙트에 대한 아이디어도 얻을 수 있습니다.

이 글에서는 Solidity 컨트랙트 인터페이스가 무엇인지 설명하고 이를 만드는 방법을 보여줍니다. 인터페이스 구현과 선언에 대한 예제도 함께 제공하여 작성 시 참고할 수 있도록 합니다.

## **Solidity 인터페이스란?**

**Solidity 컨트랙트 인터페이스는 구현 없이 함수 정의만 나열한 목록입니다.** 다시 말해, 인터페이스는 어떤 객체가 동작하기 위해 반드시 가져야 하는 모든 함수에 대한 설명입니다. 인터페이스는 컨트랙트에 정해진 속성과 함수 집합을 강제합니다.

Solidity에서는 다른 컨트랙트의 코드가 없어도 해당 컨트랙트의 인터페이스를 이용해 상호작용할 수 있습니다. 예를 들어, 자신의 컨트랙트에서 다른 컨트랙트와 상호작용하려면 호출부에 인터페이스 래퍼를 제공하면 됩니다. 인터페이스를 선언하면 다른 컨트랙트와 상호작용하고, [다른 컨트랙트의 함수를 호출](https://www.alchemy.com/overviews/solidity-call-another-contract)할 수 있습니다.

인터페이스는 보통 Solidity 컨트랙트 상단에 위치하며 "interface" 키워드로 식별됩니다. 인터페이스는 코드 중복과 오버헤드를 줄여주기 때문에, 탈중앙화 애플리케이션이 확장성을 필요로 하면서 복잡성을 피하고자 할 때 가장 유용합니다.

### **Solidity 인터페이스의 특징**

1. Solidity 인터페이스는 다른 인터페이스로부터 상속받을 수 있습니다
1. 컨트랙트는 다른 컨트랙트를 상속받듯이 인터페이스를 상속받을 수 있습니다
1. 인터페이스 함수를 오버라이드할 수 있습니다
1. 인터페이스 내부에 정의된 데이터 타입은 다른 컨트랙트에서 접근할 수 있습니다

인터페이스를 상속받는 모든 함수는 인터페이스 함수를 오버라이드하는 각 함수마다 override 수정자를 설정해야 합니다. 그렇지 않으면 [Solidity 컴파일러](https://www.alchemy.com/overviews/solidity-compiler)가 에러를 발생시킵니다.

### **추상 컨트랙트 vs. 인터페이스**

**추상 컨트랙트와 인터페이스는 web3 개발자가 더 크고 복잡한 분산 애플리케이션을 구축할 수 있게 해주는 두 가지 방법으로, Solidity 내에서 확장성을 제공합니다.**

추상 컨트랙트는 구현이 없는 함수를 최소 하나 가지고 있으며, 이 때문에 컴파일할 수 없습니다. 하지만 추상 컨트랙트는 다른 컨트랙트가 상속받을 수 있는 기본 컨트랙트로 사용할 수 있습니다.

인터페이스는 추상 컨트랙트와 유사하지만 구현된 함수를 가질 수 없습니다. 또한 인터페이스는 컨트랙트의 [Application Binary Interface(ABI)](https://www.alchemy.com/overviews/solidity-abi)가 표현할 수 있는 범위로 제한됩니다. ABI와 인터페이스 간의 변환은 정보 손실 없이 가능합니다.

## **Solidity 인터페이스를 만드는 방법**

**인터페이스는 보통 프로그램 상단에 위치하며 "interface" 키워드로 선언됩니다. 그런 다음 이 인터페이스를 사용해 다른 컨트랙트와 통신하거나, 인터페이스를 직접 구현할 수 있습니다.**

스마트 컨트랙트 지갑을 작성한다고 가정하면, 다음과 같은 형태가 될 수 있습니다:

<ImageBlock
  src="https://media.alchemy.com/1703924327-how-to-create-a-solidity-interface.png"
  alt="Solidity Interface를 만드는 방법"
  width={1346}
  height={894}
  caption="Solidity Interface를 만드는 방법"
/>

여기서 "`is IWallet`"의 사용을 주목하세요. 이 경우 `IWallet` 인터페이스를 상속받아 우리 컨트랙트인 `Wallet`에서 구현하고 있습니다.

그런 다음, 지갑(여기서는 `WalletFriendlyContract`)과 통신하고자 하는 스마트 컨트랙트가 있다면, 이 인터페이스를 재사용할 수 있습니다:

<ImageBlock
  src="https://media.alchemy.com/1703924551-re-use-solidity-interface.png"
  alt="Solidity interface 재사용"
  width={1548}
  height={894}
  caption="Solidity interface 재사용"
/>

### Solidity 인터페이스 요구사항

Solidity에서 인터페이스를 만들 때는 몇 가지 제약이 있으며, 개발자는 다음과 같은 주요 인터페이스 요구사항 목록을 기억해야 합니다:

1. 인터페이스는 구현된 함수를 가질 수 없습니다
1. 인터페이스의 [함수](https://www.alchemy.com/overviews/solidity-functions)는 external 타입만 가능합니다
1. 인터페이스는 생성자를 선언할 수 없습니다
1. 인터페이스는 상태 변수를 선언할 수 없습니다

## **Solidity 인터페이스 예제**

이 섹션에서는 Solidity 인터페이스 코드 작성에 도움이 될 몇 가지 예제를 다룹니다.

다음 [예제 인터페이스 코드](https://docs.soliditylang.org/en/v0.8.17/contracts.html#interfaces)는 **Solidity 공식 문서**에서 가져온 것으로, 트랜잭션 정보를 조회하기 위한 "Token"이라는 인터페이스를 만듭니다. 이 인터페이스에는 다른 컨트랙트로부터 수신자 주소와 전송 금액에 대한 정보에 접근하는 함수가 포함되어 있습니다.

<ImageBlock
  src="https://media.alchemy.com/1703924819-example-interface-code.png"
  alt="interface 예제 코드"
  width={1318}
  height={550}
  caption="interface 예제 코드"
/>

다음 [Solidity 인터페이스 예제](https://www.solidity-by-example.org/interface/)는 **Solidity by Example**에서 가져온 것으로, 인터페이스 선언과 구현이 모두 포함된 전체 컨트랙트를 보여줍니다.

<ImageBlock
  src="https://media.alchemy.com/1703924953-full-contract-with-interface-declaration-and-implementation.jpg"
  alt="interface 선언과 구현이 포함된 전체 contract"
  width={1053}
  height={1600}
  caption="interface 선언과 구현이 포함된 전체 contract"
/>

## **Alchemy로 Solidity 앱 개발 시작하기**

이 글에서는 Solidity 인터페이스를 소개하고, 개발자가 Solidity로 애플리케이션을 구축할 때 인터페이스를 활용해 시간을 절약하고 복잡성을 줄이는 방법을 보여주었습니다. [Solidity에 대해 계속 학습](https://www.alchemy.com/overviews/learn-solidity)하려면, Alchemy University의 [무료 Ethereum Developer Bootcamp](https://university.alchemy.com/?a=d3f70d2955)를 살펴보세요. 이 부트캠프는 7주간 자기 주도 학습으로 진행되며, 코딩 챌린지, 동영상 강의, Solidity 개발을 마스터하기 위한 최고의 자료들을 통해 Solidity 개발의 핵심 개념을 설명합니다.

개발 자체가 처음인 분들이라면, Ethereum 부트캠프를 시작하기 전에 Alchemy University의 **3주 JavaScript 단기 과정**을 선수 과정으로 수강하는 것이 좋습니다.
