접근 제어자는 함수에서는 함수명 뒤에 선언하지만, 변수를 선언할 때에는 변수명 앞에 선언합니다.

string public hi = "Hello Solidity";

public

어디서든 접근이 가능함

uint256 public a = 3;

스크린샷 2024-01-24 오후 4.00.14.png

Test라는 스마트 컨트랙트를 배포하면, a라는 변수가 생성되며, 값을 확인할 수 있습니다.

private

외부에서 접근이 불가능함

uint256 private a = 3;

스크린샷 2024-01-24 오후 4.01.24.png

배포를 하고 다른 스마트 컨트랙트를 확인해보면 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 이니 어디서든 접근이 가능합니다.

private