immutable 키워드
immutable은 constant와 비슷하게 한 번 정해지면 바꿀 수 없는 변수입니다. 다만 결정적인 차이가 하나 있습니다. immutable 변수의 값은 배포 시점에 고정됩니다. 값을 미리 코드에 박아 두는 대신, 컨트랙트를 배포하는 순간에 결정해 고정합니다.
보통 생성자(constructor)에서 값을 정하며, Solidity 0.8.21부터는 선언과 동시에 초기화할 수도 있습니다. 어느 쪽이든 값은 딱 한 번만 정해집니다.
constant 는 컴파일 시점에, immutable 은 배포 시점(생성자 실행)에 값이 고정됩니다. 그래서 배포할 때마다 달라질 수 있는 값(예: 배포자 주소)에 immutable 이 적합합니다.
constant vs immutable
둘의 가장 큰 차이는 값이 정해지는 시점입니다. constant는 컴파일 시점에 이미 알아야 하므로 msg.sender처럼 배포해 봐야 아는 값은 담지 못합니다. 반면 immutable은 배포 시점에 값이 한 번 정해지므로, 배포자 주소나 배포 시점에 전달받은 설정값을 고정하기에 알맞습니다. 한 번 정해진 뒤에는 constant처럼 절대 바꿀 수 없습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Ownable {
// 배포 시점에 한 번만 값이 정해지고 이후 변경 불가
address public immutable owner;
constructor() {
owner = msg.sender; // 배포한 사람의 주소로 고정
}
}가스를 생각하면 constant 가 먼저
immutable도 constant처럼 storage를 거의 쓰지 않아 일반 상태 변수보다 읽기 비용이 저렴합니다.
다만 constant만큼 완전히 코드에 박히지는 않으므로, 둘 다 가능한 상황이라면 더 저렴한 constant를 먼저 고르고, 배포 시점에 결정해야 하는 값에만 immutable을 씁니다.
"컴파일 시점에 이미 아는 고정값" 이면 constant, "배포 시점에 정해져 이후 고정" 이면 immutable 을
사용하세요. msg.sender 처럼 배포해 봐야 아는 값은 생성자에서 대입합니다.