접근 제어자는 함수에서는 함수명 뒤에 선언하지만, 변수를 선언할 때에는 변수명 앞에 선언합니다.
string public hi = "Hello Solidity";
어디서든 접근이 가능함
uint256 public a = 3;
Test라는 스마트 컨트랙트를 배포하면, a라는 변수가 생성되며, 값을 확인할 수 있습니다.
외부에서 접근이 불가능함
uint256 private a = 3;
배포를 하고 다른 스마트 컨트랙트를 확인해보면 public과 다르게 a 라는 변수에 접근이 불가능합니다.
즉, public을 정의 함으로 어디서든 접근이 가능한 getter 함수를 자동으로 만들었습니다.
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;
contract Test {
uint256 public a = 3;
function changeA(uint256 _value) public {
a = _value;
}
function get_a() public view returns (uint256) {
return a;
}
}
contract Test_2 {
Test instance = new Test();
function changeA_2(uint256 _value) public {
instance.changeA(_value);
}
function use_test_a() public view returns (uint256) {
return instance.get_a();
}
}
Test와 Test_2라는 두 개의 스마트 컨트랙트가 있습니다. Test_2를 이용해 Test에 접근할 것 입니다.
Test_2에 도드라지는 부분은
Test instance = new Test();
인스턴스가 보일 탠데, 이걸 통해 Test 컨트랙트에 접근이 가능합니다.
즉, 인스턴스는 Test의 분신이라고 간단하게 생각할 수 있습니다.(추후 인스턴스에 대해 설명) Test 컨트랙트의 모든 부분이 public 이니 어디서든 접근이 가능합니다.