블록체인 학습
0 XP

internal과 external

Solidity에는 public, private 외에 internal과 external이라는 가시성이 더 있습니다. 이 둘까지 익히면 네 가지 가시성이 모두 손에 들어와, 어떤 코드가 어디서 접근 가능한지 정밀하게 설계할 수 있습니다.

  • internal: 선언된 컨트랙트와 상속받은 자식 컨트랙트에서 접근 가능. 외부에서는 불가.
  • external: 오직 외부에서만 호출할 수 있는 함수 전용 지정자. 내부에서 직접 호출은 불가.

상태 변수의 기본 가시성은 internal 입니다. 따로 지정하지 않으면 internal 로 동작합니다. 단, 함수는 가시성을 반드시 명시해야 합니다.

private 보다 한 단계 넓은 internal

internal은 private보다 한 단계 넓은 가시성입니다. private이 이 컨트랙트만 허용한다면, internal은 이 컨트랙트와 그 자식들까지 허용합니다. 부모가 정의한 값이나 함수를 자식이 그대로 물려받아 쓰게 하려면 internal로 선언하면 됩니다.

함수에만 붙는 external

external은 함수에만 붙일 수 있는 지정자로, 오직 외부(다른 컨트랙트나 계정)에서만 호출되도록 합니다. 같은 컨트랙트 내부에서 이름으로 직접 부르면 컴파일 오류가 납니다. 외부 인터페이스로만 쓰이는 함수에 알맞고, 인자를 calldata에서 곧바로 읽기 때문에 public보다 가스가 조금 덜 들 때도 있습니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract Visibilities {
    uint256 internal sharedValue = 7; // 자식 컨트랙트도 접근 가능
 
    // external 함수: 외부에서만 호출 가능
    function setFromOutside(uint256 v) external {
        sharedValue = v;
    }
 
    // internal 함수: 이 컨트랙트와 자식에서만 호출 가능
    function helper() internal view returns (uint256) {
        return sharedValue * 2;
    }
 
    // public 함수가 internal 헬퍼를 호출합니다.
    function compute() public view returns (uint256) {
        return helper();
    }
}

외부 인터페이스용 함수는 external 로 두면 가스 효율이 약간 더 좋습니다. 내부에서도 써야 하면 public 을 쓰세요.

Code Editor
에디터를 불러오는 중...
실행 결과

Run 버튼을 눌러 코드를 실행하세요.