이 글은 인프런 "솔리디티 깨부수기" 강의를 듣고 정리한 글 입니다.
Instance 정의
Instance는 하나의 컨트랙에서 다른 컨트랙을 접근할 때 사용한다.
예를 들어 A 와 B 컨트랙이 있을 때, B 컨트랙에서 A 의 함수나 변수들을 접근하여 사용하고자 한다면, A 인스턴스를 만들어 B 컨트랙 안에서 사용하면 된다.
// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;
contract A{
uint256 public a = 5;
function change(uint256 _value) public {
a = _value;
}
}
contract B{
}
위의 예제에서는 B 컨트랙에서 A 컨트랙에 접근하여, 변수 a 와 change 함수를 사용하려고 한다. 이때 B 컨트랙과 A 컨트랙과의 연결을 위해 B 컨트랙에서 A를 인스턴스 정의를 해야한다.
contract B{
A instance = new A();
}
인스터스를 정의할 때에는 [컨트랙이름] [인스터스의 이름] = new [컨트랙이름](); 식으로 인스턴스를 정의할 수 있다.
이렇게 인스턴스를 생성하였고, 생성된 인스턴스를 통해서 A 컨트랙의 변수와 함수에 접근하도록 하겠다.
// SPDX-License-Identifier:GPL-30
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);
}
}
위의 예제에서 B 컨트랙은 A 컨트랙의 a 변수를 리턴하는 get_A() 함수와 a 변수를 변경해주는 change_A() 함수가 있다. 생성한 A instance 는 . 붙여서 해당하는 변수나 함수에 접근할 수 있다.
get_A() 에서 컨트랙 A의 a 변수에 접근해야 하므로 instance.a()를 썼다. 여기서 변수를 접근할 때에 뒤에 ()를 붙여야 리턴이 된다.
instance.change() 에 파라미터 값에 value를 넣어준다. view를 사용한 이유는 a 변수 값을 읽어만 오고, 변경하지 않기 때문에 view 키워드를 사용하였다.
instance 는 A 컨트랙의 원본의 것을 가지고 오는 것이 아닌 분신을 만들어 가지고와 사용하기 때문에, instance를 만들어 변수 a의 값을 변경한다고 해도 A 컨트랙 자체만 따로 배포한 곳의 값에는 영향을 주지 않는다.
즉 A 컨트랙을 따로 배포하고, 인스턴스 A를 B 컨트랙을 통해서 배포한다고 가정하였을때, 이 두개의 컨트랙은 완전히 다르다.
'자기개발 > 블록체인' 카테고리의 다른 글
[솔리디티 깨부수기] 상속1 - 정의 (0) | 2024.05.21 |
---|---|
[솔리디티 깨부수기] Instance - constructor (0) | 2024.05.21 |
[솔리디티 깨부수기] function4 - string (0) | 2024.05.10 |
[솔리디티 깨부수기] funtion3 : view와 Pure (0) | 2024.05.06 |
[솔리디티 깨부수기] funtion2 : 접근 제한자 (0) | 2024.05.06 |