728x90

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

 

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

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

www.inflearn.com


public

public은 완전히 오픈되어서 모든 곳에 접근이 가능하다. 아래와 같이 코드를 작성하고 배표를 하면 다음과 같이 값을 확인할 수 있다. 

contract Lec5 {
    uint256 public a = 3;
}

 

두 개의 스마트 컨트랙을 사용해서 public 예제를 이용해서 public 접근제한자의 특성을 설명하도록 한다. 

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Public_example {
    uint256 public a = 3;
    
    function changeA(uint256 _value) public {
        a =_value;
    }
    function get_a() view public returns (uint256)  {
        return a;
    }
}

contract Public_example_2 {
    
    Public_example instance = new Public_example();

    function changeA_2(uint256 _value) public{
      instance.changeA(_value);
    }
    function use_public_example_a() view public returns (uint256)  {
        return instance.get_a();
    }
}

 

Public_example 과 Public_example_2 라는 두개의 스마트 컨트랙을 만든다. Public_example 스마트 컨트랙안에는 changeA와 get_a 함수가 있는데 get_a 함수에 들어가 있는 view는 pure와 같이 다음 강의에서 다룰 예정이다. 

 

Public_example_2 를 사용하여 Public_example 스마트 컨트랙에 접근하려고 하는데, 접근하기 위해서는 인스턴스화를 해야한다. 인스턴스를 정의하는 부분은 Public_example_2 에서 Public_example instance = new Public_example(); 식으로 인스턴스를 정의하는 것을 알 수 있다.

 

public_example2를 배포하여 확인을 하면,  changeA_2에 10을 넣으면 10이 리턴하는 것을 보고 public으로 접근 제한자를 설정했기 때문에 모든 곳에 접근할 수 있다는 것을 알 수 있다. 

 


private

private은 오직 private이 정의된 자기 컨트랙에서만 가능하며,  private이 정의된 컨트랙을 상속 받은 자식도 접근이 불가능하기 때문에 아래와 같이 코드를 입력하고 배포를 했을 때, 변수 접근이 되지 않는 것을 확인할 수 있다. 

contract Lec5 {
    uint256 private a = 3;
}

 

이유는, private으로 정의한 변수에 접근을 하려면 오직 Lec5안에서만, private 정의된 스마트 컨트랙 내에서만 가능하다. 배포한 것은 스마트 컨트랙 내가 아니라 밖이기 때문에 접근이 불가능하다.

 

contract Public_example {
    uint256 public a = 3;
    
    function changeA(uint256 _value) private {
        a =_value;
    }
    function get_a() view private returns (uint256)  {
        return a;
    }
}

위에 public_example 컨트랙 예시에서 changeA함수와 get_a 함수의 접근 제한자를 private로 하게 되면, changeA_2 함수에서 인스턴스 changeA 값에 접근을 할 수 없어서 에러가 나게 된다.

 

이런식으로 private을 사용하면, 본 변수 값은 은닉화 시킬 수 있다.

 


external

external은 public과 유사하며, 모든 곳에 접근이 가능하나 external이 정의되어 있는 자기 컨트랙 내에서는 접근이 불가하여 자기 컨트랙이 아닌 다른 컨트랙이 접근할 때 사용된다. 

 

contract Public_example {
    uint256 public a = 3;
    
    function changeA(uint256 _value) external {
        a =_value;
    }
    function get_a() view external returns (uint256)  {
        return a;
    }
}

위에 public_example 예시를 external 접근 제한자로 바꾸고 배포를 하면 당연히 작동이 된다. 이유는 external이 정의된 스마트 컨트랙트에서 해당 함수값에 접근하는 것이 아니라 public_example2 컨트랙 즉 외부에서 external로 정의된 함수에 접근하는 것이기 때문이다. 

 

다만 여기서 uint256의 접근 제한자를 external로 바꾸게 되면 오류가 나게 된다. 


internal

internal은 private과 유사하지만 상속받은 컨트랙도 접근이 가능하다. 

+ Recent posts