Let's make Everything

[Solidity 접근제어자] 본문

Solidity

[Solidity 접근제어자]

rok92 2023. 4. 15. 23:01
728x90

Solidity에서의 접근제어자는 public, private, external, internal이 있습니다.

이 때 접근제어자는 함수 뿐만 아니라 변수 앞에 쓰이기도 합니다.

예를 들면 uint256 public num = 66; 이렇게도 쓰는 것이 가능합니다.

 

# 1. public

public은 모든 곳에서 접근이 가능한 접근제어자 입니다. 객체지향 언어를 공부했으면 익숙한 접근제어자 입니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Accessable{
    uint256 public num = 10;
}

간단하게 num이라는 변수에 10을 넣고 public으로 배포했습니다.

배포결과 클릭해보니 num변수에 10이라는 값이 잘 나오는 것을 알 수 있습니다.

이번에는 private 으로 변수선언을 해서 배포를 해보겠습니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Accessable{
    uint256 private num = 10;
}

결과는.....

private으로 선언하니 변수로 접근이 되지않는 것을 확인할 수 있습니다.

심화된 예제>

두 개의 스마트 컨트랙트를 사용한 public 입니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Accessable1{
    uint256 private num = 10;

    function changeNum(uint256 _value) public {
        num = _value;
    }

    function getNum() view public returns (uint256) {
        return num;
    }
}

contract Accessable2{
    Accessable1 instance = new Accessable1();

    function changeNum2(uint256 _value) public {
        instance.changeNum(_value);
    }

    function use_accessable() view public returns (uint256) {
        return instance.getNum();
    }

위 두 개의 스마트 컨트랙트에서 Accessable2 컨트랙트를 사용해서 Accessable1 컨트랙트에 접근하는 방법입니다.

Accessable2 컨트랙트에서 instance를 통해서 Accessable1 스마트 컨트랙트에 접근이 가능합니다.

이때 public으로 선언되어 있기 때문에 쉽게 접근 가능합니다.

결과를 보면 Accessable2 스마트컨트랙트를 배포하여 실행하니 다음과 같이 접근이 가능한 것을 확인할 수 있습니다.

# 2. private

오직 private이 정의된 자기 컨트랙트 내에서만 접근이 가능합니다. 즉, private이 정의된 컨트랙트를 상속 받은 자식 컨트랙트에서도 사용이 불가능 합니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Accessable{
    uint256 private num = 10;
}

이 스마트컨트랙트를 배포하면 위에서 보았듯이 변수가 리믹스상에 보여지지 않는다는 것을 확인했습니다. 왜냐하면 접근하려먼 오직Accessable 컨트랙트내에서만 가능하기 때문입니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Accessable{
    uint256 private num = 10;
    
    function getNum() view public returns (uint256) {
    	return num;
    }
}

위의 private변수가 선언된 컨트랙트를 배포하면

다음과 같이 변수 num은 보이지 않고 num을 리턴하는 함수로 선언한 getNum만 보입니다.

이런식으로 private을 사용하면 본 변수값은 은닉화할 수 있습니다.

# 3. external

public처럼 모든 곳에서 접근 가능하지만 external이 정의된 자기자신 컨트랙트 내에서는 접근이 불가능합니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Accessable1{
    uint256 private num = 10;

    function changeNum(uint256 _value) external {
        num = _value;
    }

    function getNum() view external returns (uint256) {
        return num;
    }
}

contract Accessable2{
    Accessable1 instance = new Accessable1();

    function changeNum2(uint256 _value) public {
        instance.changeNum(_value);
    }

    function use_accessable() view public returns (uint256) {
        return instance.getNum();
    }
}

Accessable1의 getNum은 external로 정의되어 있기 때문에 Accessable1 내에서는 접근이 불가능합니다. 하지만 Accessable2는 별개의 스마트 컨트랙트이기 때문에 접근이 가능합니다.

# 4. internal

private처럼 오직 internal이 정의된 자기 컨트랙트에서만 접근이 가능하고 internal이 정의된 현재 이 컨트랙트를 상속받은 자식컨트랙트에서도 접근이 가능합니다. (상속할 때 많이 다룰 예정입니다.)

'Solidity' 카테고리의 다른 글

[String 타입]  (0) 2023.04.29
[View와 Pure]  (0) 2023.04.27
[Function정의, 사용법?]  (0) 2023.04.15
[Ether단위와 Gas 중요성?]  (0) 2023.04.14
[Solidity DataType]  (0) 2023.04.13