constant 키워드
constant는 선언 시점에 값을 정하고 절대 바꿀 수 없는 상태 변수를 만들 때 사용합니다. 값은 컴파일 시점에 고정되며, 컴파일러가 그 값을 코드 안에 직접 박아 넣습니다. 그래서 constant 변수는 storage를 전혀 차지하지 않고, 읽을 때도 별도의 스토리지 접근 없이 곧바로 값을 사용합니다.
constant 변수는 스토리지를 사용하지 않아 일반 상태 변수보다 읽기 비용(가스)이 훨씬 저렴합니다.
선언 규칙
constant를 쓰려면 몇 가지 규칙을 지켜야 합니다. 핵심은 "컴파일러가 미리 값을 알 수 있어야 한다"는 점입니다.
- 반드시 선언과 동시에 값을 지정해야 합니다.
- 값은 컴파일 시점에 알 수 있는 상수식이어야 합니다. (예: 숫자, 문자열 리터럴, 다른 상수의 조합)
- 관례적으로 이름을
UPPER_SNAKE_CASE로 씁니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Token {
// 컴파일 시점에 고정되는 상수입니다.
uint256 public constant MAX_SUPPLY = 1000000;
string public constant SYMBOL = "TKN";
}왜 constant 를 쓰는가
constant의 장점은 두 가지입니다.
첫째, 가스 절약입니다. 일반 상태 변수는 읽을 때마다 storage에 접근해 비용이 들지만, constant는 코드에 값이 박혀 있어 거의 공짜로 읽힙니다.
둘째, 안전성입니다. 토큰 총량이나 심볼처럼 절대 바뀌면 안 되는 값을 constant로 두면, 실수로 값을 바꾸는 코드를 써도 컴파일 단계에서 걸러집니다.
constant 변수에 나중에 값을 다시 대입하려고 하면 컴파일 오류가 발생합니다.