Zig Tutorial - 2일차
포스트
취소

Zig Tutorial - 2일차

Zig 언어 공부를 시작합니다. 설치부터 문법 및 간단한 응용까지 다룹니다.

0. 튜토리얼 참고문서

1. Assignment

World 를 변수로 출력

print 함수의 args 위치에 .{ ... } 파라미터 배열을 작성한다.

1
2
3
4
const world: *const [4]u8 = "World";

std.debug.print("Hello, {s} {s}!\n", .{ world, world });
// Hello, Worl Worl!

std.log 를 std.debug 대신 사용하기

std.loginfo, debug, warn 등의 함수를 제공한다.

1
2
3
const world = "World";
std.log.debug("Hello, {s} {s}!\n", .{ world, world });
// debug: Hello, World World!

std.debug.print 함수 구현 (from the stdlib)

참고문서 : Where is print() in Zig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const std = @import("std");
const io = std.io;

pub fn lockStdErr() void {
    std.Progress.lockStdErr();
}

pub fn unlockStdErr() void {
    std.Progress.unlockStdErr();
}

pub fn print(comptime fmt: []const u8, args: anytype) void {
    lockStdErr();
    defer unlockStdErr();
    const stderr = io.getStdErr().writer();
    nosuspend stderr.print(fmt, args) catch return;
}

print 함수를 사용해보자.

1
2
3
4
const world: *const [4]u8 = "World";

print("Hello, {s} {s}!\n", .{ worl, worl });
// Hello, Worl Worl!

숫자 출력

가변 변수를 변형하지 않으면 오류를 생성한다. (const 로 변경할 것을 권유함)

1
2
3
4
5
6
const constant: i32 = 5; // signed 32-bit
var variable: u32 = 5000; // unsigned 32-bit
variable += 1;

std.debug.print("{d}, {d}\n", .{ constant + 1, variable });
// 6, 5001

@as 캐스팅을 이용한 정의

명시적인 타입 선언과 같다.

1
2
3
4
5
6
const inferred_constant = @as(i32, constant);
var inferred_variable = @as(u32, variable);
inferred_variable += 1;

std.debug.print("{d}, {d} => {d}, {d}\n", .{ constant, variable, inferred_constant, inferred_variable });
// 5, 5001 => 5, 5002

undefined 설정

1
2
const a: i32 = undefined;
var b: u32 = undefined;

unused 에러 대응하기

_ 을 사용하면 var 또는 const 변수 사용 여부를 무시하게 된다.

1
_ = 10;

2. Arrays

array 의 len 필드를 통해서 배열의 길이를 알 수 있다.

1
2
3
4
5
6
const arr_a = [5]u8{ 'H', 'e', 'l', 'l', 'o' };
const arr_b = [_]u8{ 'W', 'o', 'r', 'l', 'd' };
const length_ab = arr_a.len + arr_b.len;

std.debug.print("{s}, {s}! ({d})\n", .{ arr_a, arr_b, length_ab });
// Hello, World! (10)

슬라이싱

시작..끝 표기로 배열의 일부 범위를 지정할 수 있다.

1
2
3
4
5
const a = [_]i32{1, 2, 3, 4, 5};
const b = a[1..4];
var c = a[1..4];

b[2] = 5;  // <== 컴파일 오류

const 와 var

const 로 생성된 배열은 원소의 값을 바꿀 수 없다.

  • b 는 []const i32 로 정의된다. (immutable)
  • var 로 생성된 c 는 []i32 로 정의된다. (mutable)

9. Review

  • 조금이면 어때. 무리하지 말고 작성한 만큼만 올리자!
  • Zig 는 C 와 매우 흡사하다. 대신 위험성과 애매함을 해결하기 위한 다양한 도구를 포함하고 있다.

 
 

끝!   읽어주셔서 감사합니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.