지역 변수
지역 변수 (Local Variables)
지역 변수(local variable)는 Functions 안, comptime 블록 안, 그리고 라벨이 붙은 Blocks 안에서 만들어져요. 여기서는 지역 변수 선언의 두 가지 키워드, const와 comptime이 실제로 어떤 의미를 갖는지 차근차근 살펴볼게요.
본문
지역 변수는 Functions 내부, comptime 블록 내부, 그리고 라벨이 붙은 Blocks 내부에서 등장해요.
지역 변수가 const라면, 초기화 이후에는 그 변수의 값이 바뀌지 않는다는 뜻이에요. 만약 const 변수의 초기화 값이 comptime-known이라면, 그 변수 역시 comptime-known이 돼요.
지역 변수는 comptime 키워드로 한정(qualify)될 수도 있어요. 이렇게 하면 변수의 값이 comptime-known이 되고, 그 변수의 모든 로드(load)와 스토어(store)가 런타임이 아니라 프로그램의 의미 분석(semantic analysis) 단계에서 일어나게 돼요. 그리고 comptime 표현식 안에서 선언되는 모든 변수는 암묵적으로 comptime 변수가 돼요.
이 내용이 실제로 어떻게 동작하는지, 예제로 확인해 볼게요.
const std = @import("std");
const expectEqual = std.testing.expectEqual;
test "comptime vars" {
var x: i32 = 1;
comptime var y: i32 = 1;
x += 1;
y += 1;
try expectEqual(2, x);
try expectEqual(2, y);
if (y != 2) {
// This compile error never triggers because y is a comptime variable,
// and so `y != 2` is a comptime value, and this if is statically evaluated.
@compileError("wrong y value");
}
}
$ zig test test_comptime_variables.zig
1/1 test_comptime_variables.test.comptime vars...OK
All 1 tests passed.
여기서 x는 런타임 변수, y는 comptime 변수예요. 두 변수 모두 += 1을 한 뒤 값이 2가 되는 걸 확인하죠. 그런데 y는 comptime 변수라 y != 2가 comptime 값이 되고, 그 if문은 정적으로 평가돼요. 그래서 y != 2가 거짓이 되면 안쪽의 @compileError("wrong y value")는 절대 발동하지 않아요. 주석에도 적혀 있듯이, 이 컴파일 에러는 y가 comptime 변수이기 때문에 영원히 트리거되지 않는 거예요.