이 글은 인프런 "솔리디티 깨부수기" 5강 강의를 듣고 정리한 글입니다.
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과 유사하지만 상속받은 컨트랙도 접근이 가능하다.
'자기개발 > 블록체인' 카테고리의 다른 글
[솔리디티 깨부수기] function4 - string (0) | 2024.05.10 |
---|---|
[솔리디티 깨부수기] funtion3 : view와 Pure (0) | 2024.05.06 |
[솔리디티 깨부수기] Ether/GWei 그리고 Gas & Function1 (0) | 2024.04.29 |
[ 솔리디티 깨부수기 ] Hello Solidity & data type (0) | 2024.04.16 |
[블록체인]솔리디티 (0) | 2024.04.09 |