반응형

다음 사이트에 있는 Zig 강좌를 따라해보며 포스트를 올려보고 있습니다.

https://zig.guide/



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

 

 

이번엔 다음 링크에 있는 내용을 정리해봤습니다.  

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://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts