728x90

이 글은 인프런 "솔리디티 깨부수기" 강의를 듣고 정리한 글 입니다. 

 

[지금 무료] 솔리디티 깨부수기 | D_One - 인프런

D_One | 이 강의를 통해서, 스마트 컨트랙 제작을 위한 솔리디티 언어를 배울수 있습니다., 코딩이 처음인 분들도 OK! 처음 배우는 솔리디티, 쉽게 시작해보세요. 강의 주제 📖 [사진] 이 강의에서

www.inflearn.com


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 컨트랙을 통해서 배포한다고 가정하였을때, 이 두개의 컨트랙은 완전히 다르다.

 

+ Recent posts