Solidity 문법 - (8) 인스턴스의 생성과 사용

2023. 5. 29. 18:22BlockChain/Solidity 깨부수기 ( 유투브 강의 )

목차
1. 인스턴스의 생성과 사용
2. 인스턴스의 생성과 사용 예제 코드

 

1. 인스턴스의 생성과 사용

 

 

솔리디티에서는 다른 컨트랙트에 정의된 것들을 사용하기 위해서

 

인스턴스를 생성하여 사용한다.

 

즉, 하나의 컨트랙트에서 다른 컨트래그에 접근하기 위해서 인스턴스를 사용한다.

 

 

컨트랙트에서 인스턴스를 생성하는법은 다음과 같은 문법을 이용한다.

 

[사용할 컨트랙트 명] [ 생성할 인스턴스 명(변수명) ] = new [사용할 컨트랙트 명]( ) ;

 

 

 

2. 인스턴스의 생성과 사용 예제 코드

 

 

아래의 코드는 정의된 컨트랙트 InstanceA를 다른 컨트랙트인 InstanceB에서 접근하기 위해서,

 

인스턴스를 생성해서 사용하는 코드이다.

 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract InstanceA {
    uint256 public num = 29;

    function change(uint256 _value) public {
        num = _value;
    }
}

contract InstanceB {
    InstanceA instance = new InstanceA();

    function getNum() public view returns (uint256) {
        return instance.num();
    }

    function changeNum(uint256 _value) public {
        instance.change(_value);
    }
}

 

 

InstanceA와 InstanceB를 배포하고,

 

InstanceB에서 InstanceA에 접근하는 함수 getNum과 changeNum을 이용해서

 

InstanceA에 선언된 값을 출력해보자.

 

truffle console을 이용하여 instance에 InstanceB를 담은후에,

 

getNum()을 통해서 instanceA의 변수에 접근한 것을 볼 수 있다.

 

다음은 changeNum을 이용해 값을 변경하고 다시 getNum()을 통해서 값을 출력해보자.

 

 

인스턴스를 통해서 변수 a에 접근한 것을 확인할 수 있다.

 

만약 InstanceA와 다른 두 개의 컨트랙트에서 인스턴스를 생성한다면 값을 공유할까? 라는 궁금증이 생길 수 있다.

 

인스턴스는 생성할 때마다 서로 모양은 같지만 다른 개체이므로 값을 공유하지 않는다.

 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract InstanceA {
    uint256 public num = 29;

    function change(uint256 _value) public {
        num = _value;
    }
}

contract InstanceB {
    InstanceA instance = new InstanceA();

    function getNum() public view returns (uint256) {
        return instance.num();
    }

    function changeNum(uint256 _value) public {
        instance.change(_value);
    }
}

contract InstanceC {
    InstanceA instance = new InstanceA();

    function getNum() public view returns (uint256) {
        return instance.num();
    }

    function changeNum(uint256 _value) public {
        instance.change(_value);
    }
}

 

위의 코드에서 InstanceB와 InstanceC를 각각 a와 b 변수에 인스턴스를 생성하여 담고,

 

a에서 changeNum()을 사용하여 값을 변경하면 a.getNum()에서는 변경된 값을

b에서 getNum()을 사용하면 InstanceA에 선언되어 있는 초깃값을 출력한다.