인스턴스는 주로 하나의 컨트랙트에서 다른 컨트랙트에 접근할 때 사용함. 예를들어 A와 B 컨트랙트가 있다고 가정하면, B에서 A의 함수나 변수들을 접근하여 사용하고 싶다면 A 인스턴스를 만들어 B 컨트랙트 안에서 사용하면 됨.
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;
contract A {
uint256 public a = 5;
function change(uint256 _value) public {
a = _value;
}
}
contract B {
A instacne = new A();
}
현재 B 컨트랙트에서 A 컨트랙트에 접근하여, 변수 a와 change 함수를 사용하려고 함.
컨트랙트이름 인스턴스이름 = new 컨트랙트이름();
이런식으로 간단하게 인스턴스를 정의할 수 있음.
생성된 인스턴스를 이용해 접근할 때는 .을 붙여서 이동할 수 있음.
instance.change(_value);
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;
contract A {
uint256 public a = 5;
function change(uint256 _value) public {
a = _value;
}
}
contract B {
A instance = new A();
function get_A() public view returns (uint256) {
return instance.a();
}
function change_A(uint256 _value) public {
instance.change(_value);
}
}
get_A() 에서는 컨트랙트 A의 변수를 접근해야하니 instance.a()를 사용함.
한가지 더, 변수를 접근할 때는 ()를 꼭 붙여서 사용해야 함.
마지막으로 유의할 점은 instace는 A 컨트랙트의 분신과 같은 존재이므로, 컨트랙트 A를 배포하고, 인스턴스 A를 컨트랙트 B를 통해서 배포한다고 가정하였을 때, 두 개의 컨트랙트(A, A`)는 완전히 다른 컨트랙트임.
그렇기 때문에 instance를 만들어서 변수 a의 값을 변경한다 해도, 컨트랙트 A 자체만 따로 배포한 곳에는 값에 영향을 주지 않음.