pop과 length
동적 배열을 다루려면 지금 요소가 몇 개인지 알아야 하고, 때로는 끝 요소를 빼야 합니다. 이때 쓰는 것이 length 속성과 pop 함수입니다.
요소 개수를 알려주는 length
length는 배열에 들어 있는 요소의 개수를 알려주는 속성입니다. 함수가 아니라 속성이라 괄호 없이 numbers.length로 읽습니다. 인덱스가 0부터 시작하므로 마지막 요소의 인덱스는 항상 length - 1입니다.
uint256 n = numbers.length; // 요소 개수
uint256 last = numbers[n - 1]; // 마지막 요소마지막 요소를 제거하는 pop
pop은 동적 배열의 맨 마지막 요소를 제거하고 length를 1 줄이는 함수입니다. push와 정확히 반대로 동작한다고 생각하면 됩니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract PopLength {
uint256[] public numbers;
function add(uint256 value) public {
numbers.push(value);
}
// 마지막 요소 제거 → length -= 1
function removeLast() public {
numbers.pop();
}
// 현재 길이 반환
function size() public view returns (uint256) {
return numbers.length;
}
}numbers가 [10, 20, 30]일 때 removeLast()를 호출하면 [10, 20](length 2)이 됩니다.
빈 배열(length가 0)에 pop을 호출하면 트랜잭션이 되돌려집니다(revert). pop 전에
numbers.length > 0 인지 미리 확인하는 편이 안전합니다.
pop의 제약
pop은 임의 위치가 아니라 항상 맨 끝 요소만 제거합니다. 중간 요소를 빼는 데는 쓸 수 없습니다.
pop은 제거한 값을 반환하지 않습니다. 제거 전 값이 필요하다면 uint256 v = numbers[numbers.length - 1]; 으로 먼저 읽어 둔 뒤 pop을 호출하세요.
이렇게 length로 개수를 확인하고 pop으로 끝 요소를 안전하게 제거합니다.