반복문: for
같은 작업을 정해진 횟수만큼 반복할 때 for 반복문 을 사용합니다. 배열의 모든 요소를 순회하거나, 1부터 n까지 합을 구하는 것처럼 "몇 번 반복할지" 가 비교적 명확한 상황에 적합합니다.
for 문의 초기화, 조건, 증감
for 문은 세미콜론으로 구분된 세 부분으로 구성됩니다.
for (초기화; 조건; 증감) {
// 반복할 코드
}- 초기화: 반복을 시작할 때 한 번만 실행 (예:
uint256 i = 0) - 조건: 매 반복 직전에 검사,
true이면 본문 실행 (예:i < n) - 증감: 매 반복이 끝날 때마다 실행 (예:
i++)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract SumExample {
// 1부터 n까지의 합을 계산합니다.
function sumTo(uint256 n) public pure returns (uint256) {
uint256 total = 0;
for (uint256 i = 1; i <= n; i++) {
total += i;
}
return total;
}
}반복문과 가스(gas) 비용
블록체인에서 반복문은 특별히 조심해야 합니다. EVM 에서는 모든 연산이 gas 를 소모하는데, 반복 본문이 한 번 돌 때마다 그만큼 가스가 쌓입니다.
그래서 반복 횟수가 많을수록 트랜잭션 비용이 커지고, 결국 가스 한도를 넘으면 트랜잭션 전체가 실패 합니다. 특히 길이를 예측할 수 없는 배열을 끝까지 순회하는 루프는 위험합니다.
여기서 가스 한도는 두 가지로 나뉩니다.
- 트랜잭션 gas limit: 한 트랜잭션이 쓸 수 있는 상한으로, 트랜잭션을 보내는 발신자가 직접 정합니다.
- block gas limit: 한 블록 전체가 담을 수 있는 가스 총량입니다. 트랜잭션 하나가 이 값을 넘게 설정될 수는 없으므로, 사실상 트랜잭션 한도의 상한 역할을 합니다.
반복 횟수가 사용자 입력이나 배열 길이에 따라 무한정 커질 수 있는 루프 는 피하세요. 실행 도중
가스를 다 써 버리면 revert 가 아니라 out-of-gas 예외 가 발생합니다. 둘 다 상태 변경은
되돌아가지만, revert 는 남은 가스를 돌려주는 반면 out-of-gas 는 보낸 가스를 전부 소진 한다는
점이 다릅니다.
실무에서는 반복 횟수에 상한선을 두거나, 큰 작업을 여러 트랜잭션으로 나누는 패턴을 자주 씁니다.