본문 바로가기
Programing/Solidity

[Solidity] Scope와 Visibility (Public, Private, External, Internal)

by AustinProd 2022. 3. 10.

솔리디티로 스마트 컨트렉트 작성 시, 아래와 같은 함수를 볼 수 있다. 내부에 작성된 코드는 생략하고 함수가 선언된 형식에 집중해보자. 여타 프로그래밍 언어와 유사한 부분이 있는 듯 하지만 선언문의 순서라던지 용어에서 차이점을 느낄 수 있을 것이다.

 

오늘 포스팅에서 집중해서 볼 부분은 스코프(Scope 혹은 Visibility)다. 아래 함수 예제 코드에서 확인할 수 있는 public, priavate, external, internal 등이 이에 해당한다.

 

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

contract Decalaration {
    int public numA = 100;
    int numB = 500;

    function privateFn() private view returns(int) {
        return numA;
    }

    function publicCallPrivateFn() public view returns(int) {
        int testNum;
        testNum = privateFn();
        return testNum;
    }

    function internalFn() internal view returns(int) {
        return numA;
    }

    function externalFn() external view returns(int) {
        return numA;
    }
}    

 

스코프(Scope 혹은 Visiblitiy)란 변수(Variable) 혹은 함수(Function) 선언과 함께 붙는 옵션과 같은 개념으로 해당 변수(혹은 함수)가 사용 및 호출 될 때 어디까지 허용하는지 그 범위를 나타낸다. 단편적인 예시로 전역변수, 지역변수와 같은 개념이다.

 

솔리디티에서는 변수와 함수에 있어 사용범위 설정에 Public, Private, External, Internal 등 총 4개가 있다. 하나씩 알아보자.

 

Public

`public` 옵션이 붙은 변수와 함수는 컨트렉트 내부뿐만 아니라 외부에서도 호출이 가능하다. 컨트렉트 안에서 어떤 영역이든 사용이 가능하며, 그 값은 공유된다. 다음에 알아볼 컨트렉트 간 상속(Inheriance)에서도 동일하게 적용된다. 부모-자식의 관계가 성립된 컨트렉트들이 있다면, 부모에서 public 으로 선언된 변수와 함수는 자식에서도 사용될 수 있다.

 

추가적으로, 변수 선언에서 특정 스코프를 명시하지 않고 생력한다면 해당 변수는 자동으로 public 옵션을 부여받게 된다.

 

Private

`private`은 오직 내부에서만 사용되도록 제한한다. private 으로 선언된 변수나 함수는 오직 해당 컨트렉트 내부에서만 사용될 수 있다. 만약, private 값은 외부에서 호출하고 싶다면, private 값을 호출하는 내부 public 혹은 external 함수를 통해 우회해야 한다.

 

External

`external` 키워드는 오직 컨트렉트 외부에서 호출할 것임을 나타내는 옵션이다. 부모-자식 간의 상속(Inheritance) 혹은 인터페이스(Inferface)를 통해 컨트렉트를 구성할 때 사용된다.

 

Internal

`internal` 은 내부에서는 public 과 동일하지만, 외부 호출에서는 오직 상속(Inheritance) 관계에서만 허용된다. private 옵션에 상속이 허용된 정도이다.

댓글