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 을 쓰세요.