다음 사이트에 있는 Zig 강좌를 따라해보며 포스트를 올려보고 있습니다.
2024. 3. 30 최초작성
다음 포스트를 참고하여 zig 개발 환경을 구성하세요.
zig 설치하여 Visual Studio Code 개발환경 만들기 - Windows, Linux, macOS
https://webnautes.tistory.com/2301
zig 강좌를 진행하고 있습니다.
zig 강좌 01 - Assignment(대입)
https://webnautes.tistory.com/2304
zig 강좌 02 - Arrays(배열)
https://webnautes.tistory.com/2305
zig 강좌 03 - if 문
https://webnautes.tistory.com/2306
zig 강좌 04 - while 문
https://webnautes.tistory.com/2308
zig 강좌 05 - for 문
https://webnautes.tistory.com/2309
zig 강좌 06 -함수
https://webnautes.tistory.com/2313
zig 강좌 07 - Defer
https://webnautes.tistory.com/2317
zig 강좌 08 - Switch
https://webnautes.tistory.com/2324
이번엔 다음 링크에 있는 내용을 정리해봤습니다.
https://zig.guide/language-basics/arrays
배열을 선언시 [N]T 형식을 사용하며, 여기서 N은 배열의 원소 개수이고 T는 해당 원소의 타입입니다.
배열의 크기를 추론하기 위해 N을 _로 대체할 수 있습니다.
// 배열 원소의 타입으로 부호없는 8비트 정수타입을 사용하고 원소 크기가 5인 배열을 선언합니다. {} 안에 배열의 원소를 ,로 구분하여 적습니다. const a = [5]u8{ 'h', 'e', 'l', 'l', 'o' }; // 배열 원소의 타입으로 부호없는 8비트 정수타입을 사용하고 배열의 원소 개수를 적지 않고 _로 대체합니다. 배열의 원소 크기를 적어줄 필요가 없습니다. const b = [_]u8{ 'w', 'o', 'r', 'l', 'd' }; |
배열과 배열의 크기를 화면에 출력해보겠습니다. 현재 print 문에서는 배열 전체를 한번에 출력하는 방법을 제공하고 있지 않습니다.
// 표준 라이브러리를 로드합니다. const std = @import("std"); pub fn main() void { // 배열 원소의 타입으로 부호없는 8비트 정수타입을 사용하고 배열의 원소 개수를 적지 않고 _로 대체합니다. // const로 배열 선언하면 배열의 값을 변경할 수 없습니다. var을 사용하여 배열을 선언해야 이후 값 변경이 가능합니다. const array = [_]u8{ 'h', 'e', 'l', 'l', 'o' }; // 상수 length에는 배열 윈소의 크기 5가 저장됩니다. // const로 선언하면 length는 상수가 되기 때문이 이후 값을 변경할 수 없습니다. const length = array.len; // 배열: 을 화면에 출력합니다. 문자열 출력시에도 .{}가 필요하며 줄바꿈이 기본적으로 되지 않습니다. std.debug.print("배열: ", .{}); // print 문에서는 배열 전체를 한번에 출력할 수 있는 방법을 제공하지 않기 때문에 for 문을 사용하여 배열 array의 원소를 하나씩 출력합니다. for (array) |item| { std.debug.print("{c}", .{item}); } // 줄바꿈을 출력합니다. std.debug.print("\n", .{}); // 배열의 크기를 출력합니다. ""안에 있는 {} 위치에 .{}에 인자로 넣은 length의 값이 출력됩니다. std.debug.print("배열의 크기: {}\n", .{length}); } |
실행결과입니다. 배열의 내용과 배열의 크기가 출력됩니다.
% zig run main.zig
배열: hello
배열의 크기: 5
배열의 원소가 정수인 경우의 예제 코드입니다.
const std = @import("std"); pub fn main() void { // 부호있는 32비트 정수 타입으로 정수가 저장된 배열을 선언합니다. const a = [_]i32{ 1, 2, 3 }; // 배열 a를 출력합니다. for (a) |item| { std.debug.print("{} ", .{item}); } std.debug.print("\n", .{}); } |
실행 결과입니다.
% zig run main.zig
1 2 3
배열의 원소가 실수인 경우의 예제코드입니다.
const std = @import("std"); pub fn main() void { // 32비트 실수 타입으로 실수 저장된 배열을 선언합니다. const a = [_]f32{ 1.1, 2.2, 3.3, 4.4, 5.5 }; // 배열 a를 출력합니다. for (a) |item| { std.debug.print("{} ", .{item}); } std.debug.print("\n", .{}); } |
실행 결과입니다.
% zig run main.zig
1.10000002e+00 2.20000004e+00 3.29999995e+00 4.40000009e+00 5.5e+00
배열의 원소를 변경해보고 인덱스를 사용하여 배열의 원소를 출력해봅니다.
const std = @import("std"); pub fn main() void { // var을 사용하여 원소를 수정 가능하도록 배열을 선언합니다. var a = [_]i32{ 1, 2, 3, 4, 5 }; // 배열의 두 번째 원소(인덱스 1)를 5로 변경합니다. a[1] = 100; std.debug.print("배열의 두 번째 원소(인덱스 1)를 출력합니다.\n", .{}); std.debug.print("{}\n", .{a[1]}); std.debug.print("\n", .{}); // 출력을 보기 좋게 하기 위해 추가합니다. std.debug.print("인덱스를 사용하여 배열 a의 전체 원소를 출력합니다.\n", .{}); for (a, 0..) |item, index| { // 0.. 은 인덱스 범위 시작을 0으로 하고 인덱스 범위 끝은 지정하지 않는다는 의미입니다. std.debug.print("a[{}] = {}\n", .{ index, item }); } std.debug.print("\n", .{}); // 출력을 보기 좋게 하기 위해 추가합니다. std.debug.print("인덱스 0부터 인덱스 1까지 배열의 원소를 출력합니다.\n", .{}); for (a[0..2], 0..) |item, index| { // 인덱스 범위 0..2는 인덱스 0, 1에 해당됩니다. 끝인덱스가 범위에 포함되지 않기 때문입니다. std.debug.print("{} {}\n", .{ index, item }); } } |
실행결과입니다.
% zig run main.zig
배열의 두 번째 원소(인덱스 1)를 출력합니다.
100
인덱스를 사용하여 배열 a의 전체 원소를 출력합니다.
a[0] = 1
a[1] = 100
a[2] = 3
a[3] = 4
a[4] = 5
인덱스 0부터 인덱스 1까지 배열의 원소를 출력합니다.
0 1
1 100
Zig에서는 하나의 배열에 서로 다른 타입의 값들을 직접적으로 섞어서 사용하는 것이 기본적으로 허용되지 않습니다. 배열은 동일한 타입의 값들로 구성되어야 합니다.
시험삼아 정수 배열에 문자를 하나 추가해봅니다.
const std = @import("std"); pub fn main() void { // 정수 배열에 문자를 추가해봅니다. const a = [_]i32{ 1, 2, 3, 4, 5, 'a' }; // 배열 a를 출력합니다. for (a) |item| { std.debug.print("{} ", .{item}); } std.debug.print("\n", .{}); } |
실행해보면 에러는 나지 않지만 문자 a에 해당하는 아스키코드가 출력됩니다. 문자는 아스키코드로 변환되기 때문에 에러가 발생하지는 않으며 출력시 문자 a로 출력되지는 않습니다.
% zig run main.zig
1 2 3 4 5 97
하지만 다음처럼 실수를 추가해보면 에러가 발생합니다.
const std = @import("std"); pub fn main() void { // 정수 배열에 문자를 추가해봅니다. const a = [_]i32{ 1, 2, 3, 4, 5, 6.6 }; // 배열 a를 출력합니다. for (a) |item| { std.debug.print("{} ", .{item}); } std.debug.print("\n", .{}); } |
실행하면 다음처럼 에러가 발생합니다.
% zig run main.zig
main.zig:6:38: error: fractional component prevents float value '6.6' from coercion to type 'i32'
const a = [_]i32{ 1, 2, 3, 4, 5, 6.6 };
'Zig > Zig 강좌' 카테고리의 다른 글
zig 강좌 06 -함수 (0) | 2024.04.10 |
---|---|
zig 강좌 05 - for 문 (0) | 2024.04.06 |
zig 강좌 04 - while 문 (0) | 2024.04.04 |
zig 강좌 03 - if 문 (0) | 2024.04.02 |
zig 강좌 01 - Assignment(대입) (0) | 2024.04.01 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!