관리 메뉴

즐겁게, 코드

솔리디티 - 06. 상속과 인터페이스 본문

💬 언어/Solidity

솔리디티 - 06. 상속과 인터페이스

Chamming2 2021. 4. 16. 19:45

솔리디티는 "계약 지향 프로그래밍 언어" 인데요, 사실 배우다 보면 객체지향 프로그래밍과도 유사한 점이 많습니다.

 

상속을 통해 "고양이 동물이다" 처럼 부분집합 관계에 있는 컨트랙트의 논리적 계층구조를 표현할 수 있으며, 동일한 로직을 다수의 클래스로 분할해서 단순히 코드를 정리할 때도 활용할 수 있습니다.

1. 상속

솔리디티에서는 is 키워드를 통해 컨트랙트를 상속받을 수 있습니다.

contract Doge {
  function catchphrase() public returns (string) {
    return "So Wow CryptoDoge";
  }
}

contract BabyDoge is Doge {
  function anotherCatchphrase() public returns (string) {
    return "Such Moon BabyDoge";
  }
}

BabyDoge 컨트랙트는 Doge 컨트랙트를 상속받은 상태이며, 상속한 부모 컨트랙트의 internal 함수를 활용할 수 있습니다.

또한 상속받을 컨트랙트를 ,(콤마) 로 구분해 둘 이상의 컨트랙트를 다중 상속받는것도 가능합니다.

contract Doge {
  function catchphrase() public returns (string) {
    return "So Wow CryptoDoge";
  }
}

contract BabyDoge is Doge, Etherium {
  function anotherCatchphrase() public returns (string) {
    return "Such Moon BabyDoge";
  }
}

2.  인터페이스

인터페이스는 컨트랙트와 마찬가지로 contract 키워드를 사용해 생성할 수 있습니다.

다만, 다른 컨트랙트와 상호작용하는 함수만을 선언할 뿐, 다른 함수나 상태 변수를 사용하지 않습니다.

(* 함수를 선언하므로 본문은 구현하지 않습니다.)

contract KittyInterface {
  function getKitty(uint256 _id) external view returns (
    bool isGestating,
    bool isReady,
    uint256 cooldownIndex,
    uint256 nextActionAt,
    uint256 siringWithId,
    uint256 birthTime,
    uint256 matronId,
    uint256 sireId,
    uint256 generation,
    uint256 genes
  );
}

이렇게 생성한 인터페이스를 활용하기 위해서는 인자로 주소를 대입해 초기화해주면 됩니다.

contract KittyInterface {
  function getKitty(address _id) external view returns (
    bool isGestating,
    bool isReady,
    uint256 cooldownIndex,
    uint256 nextActionAt,
    uint256 siringWithId,
    uint256 birthTime,
    uint256 matronId,
    uint256 sireId,
    uint256 generation,
    uint256 genes
  );
}

contract MyContract {
  address ckAddress = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d;
  // 인터페이스를 사용하려면 고유의 address형 주소를 인자로 대입합니다.
  KittyInterface kitty = KittyInterface(ckAddress)

  function someFunction() public {
    // 이제 `kitty`가 가리키고 있는 컨트랙트에서 `getKitty` 함수를 호출할 수 있습니다.
    uint myKitty = kitty.getKitty(msg.sender);
  }
}

 

반응형
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆