Run 버튼을 눌러 코드를 실행하세요.
Run 버튼을 눌러 코드를 실행하세요.
Solidity의 변수는 선언 위치와 출처에 따라 성격이 크게 달라집니다. 앞 강의에서 배운 상태 변수는 컨트랙트에 영구히 남지만, 함수 안에서 잠깐 쓰는 값이나 Solidity가 기본으로 제공하는 특수 값은 성격이 전혀 다릅니다. 이 셋을 구분해 두면 어떤 데이터가 어디에 보관되는지, 가스 비용이 어디서 발생하는지 한눈에 들어옵니다.
상태 변수(state variable): 컨트랙트 본문에 선언, storage에 영구 저장지역 변수(local variable): 함수 안에 선언, 함수 실행 동안만 존재전역 변수(global variable): Solidity가 기본 제공하는 특수 변수(msg.sender, block.timestamp 등)uint256·bool·address 같은 값 타입 지역 변수는 스택(stack)에 놓였다가 함수가 끝나면
즉시 사라집니다. 스토리지에 기록되지 않으므로 가스 비용이 거의 들지 않습니다.
지역 변수는 함수가 호출될 때 생겼다가 함수가 끝나면 즉시 사라집니다. 중간 계산 결과를 담거나 반복문 카운터로 쓰기에 알맞고, 값 타입 지역 변수는 storage에 기록되지 않으므로 가스 부담이 거의 없습니다. 영구 보관이 필요 없는 값은 되도록 지역 변수로 처리하는 편이 효율적입니다.
배열·구조체·매핑 같은 참조 타입 지역 변수는 사정이 다릅니다. 값이 어디에 놓이는지 컴파일러가 알 수 없어, memory·storage·calldata 중 하나를 직접 명시해야 합니다.
memory: 함수 실행 동안만 쓰는 복사본입니다. 함수가 끝나면 사라집니다.calldata: 외부에서 전달된 읽기 전용 입력입니다.storage: 상태 변수를 가리키는 포인터입니다. 복사본이 아니라서, 여기에 대입하면 실제 스토리지 값이 바뀝니다.storage 로 선언한 지역 변수는 "임시 값"이 아닙니다. 상태 변수를 직접 가리키므로 그 변수를 고치면
컨트랙트에 영구히 반영되고, 스토리지 쓰기 비용도 그대로 발생합니다. 데이터 위치를 실제로 골라 쓰는
법은 Chapter 7(배열)부터 자세히 다룹니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract ScopeExample {
uint256 public total; // 상태 변수: 영구 저장
function addTwice(uint256 x) public {
uint256 doubled = x * 2; // 지역 변수: 이 함수 안에서만 유효
total = total + doubled;
}
function whoCalled() public view
전역 변수는 따로 선언하지 않아도 Solidity가 항상 제공하는 특수 변수입니다. msg.sender(호출자 주소), msg.value(보낸 이더), block.timestamp(블록 시각) 등이 대표적이며, 트랜잭션과 블록의 문맥 정보를 담습니다. 그중 msg.sender는 누가 이 함수를 불렀는지 알려주어 접근 제어에 특히 자주 쓰입니다.
msg.sender 는 현재 함수를 호출한 계정의 주소를 담은 전역 변수입니다. 접근 제어에 자주 쓰입니다.