Solidity : 상속받은 계약에서 base 계약의 Constructor 접근하기

참고 : http://solidity.readthedocs.io/en/develop/contracts.html#arguments-for-base-constructors

이번에 다뤄볼 주제는, 계약의 OOP를 위해서 반드시 필요한 개념입니다. 예를 들면 어떤 계약 A가 있다고 가정하고, 계약 B가 A를 상속받았다고 가정합시다. 그러면 코드는 아래와 같이 될 것입니다.

contract A { ... }
contract B is A { ... }

그렇다면 이제 B의 계약을 만들면서 A의 생성자를 마찬가지로 call하려면 어떻게 해야 할까요?
아래의 계약을 예로 생각해봅시다.

pragma solidity ^0.4.22;

contract Base {
    uint x;
    constructor(uint _x) public { x = _x; }

    function getX() public view returns (uint256) { return x; }
}

계약은 간단합니다. Base 계약에서는 x라는 멤버 변수가 있는데, 생성자에서 그 x값을 세팅하고, 멤버 함수로는 세팅된 x의 값을 리턴하는 getX라는 함수를 갖습니다.

이제 이 계약을 상속받는 계약을 생각해 봅시다.

contract Derived is Base {
    constructor(uint _y) Base(_y * _y) public { }
}

여기서 Derived라는 계약은 생성시에 argument를 받아서 이를 제곱한 값을 Base의 constructor의 argument로 넣고 있습니다. 보통 자바에서는 생성자 함수 내에서 super(_y * _y);식으로 콜 했을텐데, solidity에서는 위와 같이 modifier위치에서 세팅하는 것이 문법입니다.

그렇다면 마지막 테스트로, Derived 계약을 만들고 argument로 7을 넣어줍시다. 그렇다면 Base계약의 생성자에 7*7=49를 넣을 것이기 때문에 결국 getX함수에 의해서 49가 나와야 할 것입니다.

Screen Shot 2018-05-05 at 7.26.08 AM.pngScreen Shot 2018-05-05 at 7.26.14 AM.png

잘 동작함을 확인할 수 있습니다. 이 부분이 복잡한 계약을 만듦에 있어서 굉장히 중요한 문법을 차지하기 때문에 포스팅 해 봤습니다 🙂