상세 컨텐츠

본문 제목

솔리디티 강좌 5강 function 2 - public,private,internal, external

솔리디티 깨부수기 - 기본

by D_One 2021. 9. 1. 01:37

본문

 

 

지난 강의에서 function을 정의 하는 법을 배워봤습니다.

 

    function 이름 () public { // (public, private, internal, external) 변경가능.  
      // 내용
    }

 

function의 접근제어자는 public, private, internal, external 이 있어요. 

사실 접근제어자는 변수 앞에도 쓰이기도 한답니다.

1강에서 hi 라는 변수를 정의할때 도 쓰였답니다.

 string public hi = "Hello solidity";

 

1. public : 어디서든 접근이 가능하다. 

contract Lec5 {
    uint256 public a = 3;
}

아주 간단하게, 변수에 public을 넣어 봤어요.

 

 

Lec5라는 스마트 컨트랙을 배포하니, a 라는 변수가 생기며, 클릭하니 값이 나오는걸 확일 할 수 있습니다.

반면에, public 과 반대되는 private을 한번 넣어 볼게요. 

private이니 외부에서 접근이 힘들겠죠.

 

contract Lec5 {
    uint256 private a = 3;
}

배포를 해보니 public 과는 다르게 a 라는 변수조차 접근 하기 힘듭니다.

 

즉 public을 정의 해줌으로써, 어디서든 접근이 가능한 getter 함수를 자동으로 만들어 주었습니다. 

 

그러면 좀 더 나아가서, 두개의 스마트 컨트랙을 사용해서 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_2 를 사용하요 Public_example 에 접근 할 것입니다.

Public_example_2 에 도드라지게 눈에 뛰이는 Public_example instance = new Public_example(); 인스턴스가 보일것입니다. 

저희는 이 인스턴스를 통해서 Public_example 컨트랙에 접근이 가능하답니다. 

즉, 인스턴스는 Public_example 의 분신이라고 간단하게 일단 생각하시면 됩니다.

( 나중 강의에서 인스턴스에 대해 설명할게요)

Public_example 컨트랙은 당연히 모든 부분이 public 이니 쉽게 접근이 가능하답니다. 

 

한가지더,

function use_public_example_a() view public returns (uint256) 에서  view 라는 키워드를 처음 보셨을거예요.

이 키워드에 대해서는 다음 강의에 설명드릴께요

 

2. private: 오직 private이 정의된 스마트 컨트랙에서만 접근가능 

 

contract Lec5 {
    uint256 private a = 3;
}

위에 예제에서 보셨듯이, 이 스마트 컨트랙을 배포를 하면 a 라는 변수가 리믹스 상에서 보여지지가 않아요.

왜냐하면, 접근을 하려면 오직 Lec5안에서만 가능하기 때문이죠.

이와같이, Lec5_2처럼 instance 를 만들어서도 접근이 불가능하답니다. 

 

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

}

 

위에 private_example을 배포를 하면, a 변수는 보이지 않고 get_a의 function 만 보입니다.

물론 get_a는 public이니 보이는거고 a는 private이니 보이지 않아요.

그러나, private 특성으로 저희는 private_example라는 같은 스마트 컨트랙에 있는 get_a function 을 통해서

private a 변수를 접근 해서 값을 불러 왔답니다.

 

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

 

3. external : 오직 밖에서만 접근 가능. 

 

external 은 public과 성향이 비슷한데요, 한가지만 다르답니다.

external이기에, external이 정의된 스마트 컨트랙 내에서는 사용이 불가능 하답니다(private과 반대되죠)

 

contract external_example {
    uint256 private a = 3;
    
    function get_a() view external returns (uint256)  {
        return a;
    }

}

contract external_example_2 {
    
    external_example instance = new external_example();

    function external_example_get_a() view public returns (uint256)  {
        return instance.get_a();
    }
}

external_examle 의 get_a 는 external 로 정의 되어 있기에, external_examle  내에서는 접근이 불가능해요.

그러나, external_examle _2는 전혀 별개의 스마트 컨트랙이기에 가능하답니다.

 

4. internal : 오직 internal이 정의된 스마트 컨트랙 내에서, 상속받은 자식 스마트 컨트랙에서 접근 가능.

internal 은 private 과 비슷해요, private에서 한가지 기능(상속받은 자식 접근 가능)이 더 추가 되었다고 생각하시면 됩니다.

상속 부분 강의할때 자세하게 다루어 볼게요

 

public: 모든곳에서 접근 가능

external: public 처럼 모든곳에서 접근 가능하나, external이 정의된 자기자신 컨트랙 내에서 접근 불가

 

private: 오직 private이 정의된 자기 컨트랙에서만 가능( private이 정의된 컨트랙을 상속 받은 자식도 불가능)

internal: private 처럼 오직 internal 이 정의된 자기 컨트랙에서만 가능하고, internal이 정의된 컨트랙을 상속받은 자식들도 접근이 가능

 

 

비디오 꼭 참고 하셔야 합니다.

관련글 더보기