Apidog

올인원 협업 API 개발 플랫폼

API 설계

API 문서

API 디버깅

API 모킹

API 자동화 테스트

초보자를 위한 Zig 튜토리얼: Zig 설치 및 사용 방법

Young-jae

Young-jae

Updated on April 2, 2025

지그(Zig)는 강력하고 최적화된 유지보수가 쉬운 현대적인 범용 프로그래밍 언어입니다. 단순성과 명확성에 초점을 맞춘 지그는 숨겨진 제어 흐름 및 할당을 피하면서 저수준 제어를 제공합니다. 이 튜토리얼에서는 설치 과정, 첫 번째 지그 프로그램 작성, 테스트 실행에 대해 안내합니다. 끝맺을 때쯤이면 이 강력한 언어를 더 깊이 탐구할 수 있는 탄탄한 기초가 마련될 것입니다.

강력한 개발 도구를 탐색하는 동안 API 개발 및 테스트를 위한 포스트맨의 궁극적인 대안인 Apidog를 언급할 가치가 있습니다. Apidog는 API 문서화, 설계, 모의, 테스트 및 디버깅을 단일화된 플랫폼으로 통합합니다.

버튼

직관적인 인터페이스, 협업 기능 및 매끄러운 버전 관리 통합을 통해 Apidog는 API 작업을 하는 개발자들에게 작업 흐름의 효율성을 획기적으로 개선합니다. 자동화된 테스트, 환경 관리, 요청 체인 및 지능적인 응답 검증을 포함한 포괄적인 기능 세트로, 현대 개발 팀에 필수적인 도구입니다.

버튼

지그 프로그래밍을 시작하기 전에 API 및 웹 서비스 작업 시 전반적인 생산성을 향상시키기 위해 Apidog를 개발자 도구 모음에 추가하는 것을 고려해 보세요.

1부: 지그 설치하기

지그에서 프로그래밍을 시작하기 전에 컴파일러와 도구를 설치해야 합니다. 설치 과정은 운영 체제에 따라 다릅니다.

리눅스에 설치하기

리눅스에 지그를 설치하는 방법은 두 가지가 있습니다:

옵션 1: 배포판의 패키지 관리자를 사용하기

대부분의 주요 리눅스 배포판에서는 최신 지그 릴리스를 패키징하고 있습니다. 이는 종종 가장 쉬운 방법입니다:

# Debian/Ubuntu용
sudo apt install zig

# Fedora용
sudo dnf install zig

# Arch Linux용
sudo pacman -S zig

옵션 2: 수동 설치하기

배포판에 지그가 없거나 특정 버전이 필요한 경우:

CPU 아키텍처에 맞는 공식 웹사이트에서 미리 빌드된 지그 버전을 다운로드하세요.

아키텍처를 확인하려면:

uname -m

tar를 사용하여 아카이브를 추출하세요:

tar xf zig-linux-x86_64-0.13.0.tar.xz

지그 바이너리를 PATH에 추가하세요:

echo 'export PATH="$HOME/zig-linux-x86_64-0.13.0:$PATH"' >> ~/.bashrc

변경사항을 적용하세요:

source ~/.bashrc

윈도우에 설치하기

윈도우 사용자들은 여러 가지 옵션이 있습니다:

옵션 1: 패키지 관리자 사용하기

# Chocolatey 사용
choco install zig

# Winget 사용
winget install zig.zig

# Scoop 사용
scoop install zig

옵션 2: 수동 설치하기

CPU 아키텍처에 맞는 윈도우용 미리 빌드된 지그 버전을 다운로드 하세요 (대부분의 윈도우 시스템은 x86_64/AMD64를 사용합니다).

아키텍처를 확인하려면:

$Env:PROCESSOR_ARCHITECTURE

ZIP 파일을 추출하세요.

지그를 PATH에 추가하세요:

현재 사용자:

[Environment]::SetEnvironmentVariable(
    "Path",
    [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\\\\path\\\\to\\\\zig-windows-x86_64",
    "User"
)

전체 시스템:

[Environment]::SetEnvironmentVariable(
    "Path",
    [Environment]::GetEnvironmentVariable("Path", "Machine") + ";C:\\\\path\\\\to\\\\zig-windows-x86_64",
    "Machine"
)

터미널을 닫고 다시 여세요.

macOS에 설치하기

macOS에서 지그를 설치하는 가장 간단한 방법은 Homebrew를 사용하는 것입니다:

brew install zig

설치 확인하기

설치 후, 다음을 실행하여 지그가 올바르게 설치되었는지 확인하세요:

zig version

다음과 같은 출력이 보여야 합니다:

0.13.0

2부: 지그에서 Hello, World!

지그가 설치되었으니 첫 번째 지그 프로그램인 전통적인 "Hello, World!" 예제를 만들어 보겠습니다.

프로그램 파일 만들기

  1. main.zig라는 이름의 새 파일을 만드세요.
  2. 선호하는 텍스트 편집기로 여세요.
  3. 다음 코드를 추가하세요:
const std = @import("std");

pub fn main() void {
    std.debug.print("Hello, {s}!\\\\n", .{"World"});
}

이 코드가 하는 일을 분석해 보겠습니다:

  • const std = @import("std");는 지그의 표준 라이브러리를 가져옵니다.
  • pub fn main() void {는 프로그램의 진입점 역할을 하는 메인 함수를 선언합니다.
  • std.debug.print("Hello, {s}!\\\\n", .{"World"});는 표준 오류 스트림(stderr)에 "Hello, World!"를 출력합니다.
  • {s}는 문자열 형식 지정자이고, .{"World"}는 지그가 형식 지정자에 인수를 전달하는 방법입니다.

프로그램 실행하기

프로그램을 빌드하고 실행하려면 다음 명령어를 사용하세요:

zig run main.zig

이 명령은 코드를 컴파일하고 즉시 실행합니다. 다음과 같은 출력을 보게 될 것입니다:

Hello, World!

파일 인코딩에 대한 중요 알림

지그는 소스 파일에 UTF-8 인코딩을 요구합니다. invalid bytes와 같은 오류가 발생하면 파일이 다른 인코딩을 가지고 있을 수 있습니다. 이를 해결하려면:

zig fmt main.zig

이 명령은 파일을 UTF-8로 재인코딩합니다. 그런 다음, 편집기에서 파일을 다시 여세요.

3부: 지그에서 테스트 실행하기

지그에는 쉽고 효과적인 테스트를 작성하고 실행할 수 있는 내장 테스트 프레임워크가 있습니다. 테스트 사용 방법을 이해하는 것은 지그를 배우는 데 있어 중요합니다. 지그 문서의 많은 예제가 테스트로 제공되기 때문입니다.

통과하는 간단한 테스트 만들기

기본 테스트 파일을 만들어 보겠습니다:

  1. test_pass.zig라는 이름의 새 파일을 만드세요.
  2. 다음 코드를 추가하세요:
const std = @import("std");
const expect = std.testing.expect;

test "always succeeds" {
    try expect(true);
}

이 코드는 테스트 모듈을 가져온 후 true가 true가 되기를 기대하는 "always succeeds"라는 테스트를 정의합니다.

이 테스트를 실행하려면:

zig test test_pass.zig

다음과 유사한 출력을 보게 될 것입니다:

모든 1개의 테스트 통과.

실패하는 테스트 만들기

이제, 테스트 실패를 이해하기 위해 실패하는 테스트를 만들어 보겠습니다:

  1. test_fail.zig라는 파일을 만드세요.
  2. 다음 코드를 추가하세요:
const std = @import("std");
const expect = std.testing.expect;

test "always fails" {
    try expect(false);
}

이 테스트는 false가 true가 되기를 기대하는데, 이는 명백히 실패하게 됩니다.

다음과 같이 실행하면:

zig test test_fail.zig

다음과 같은 오류 출력을 보게 될 것입니다:

테스트 [1/1] test.always fails... 실패 (TestUnexpectedResult)
/usr/lib/zig/std/testing.zig:515:14: 0x2241ef in expect (test)
if (!ok) return error.TestUnexpectedResult;
^
[...]/test_fail:5:5: 0x224305 in test.always fails (test)
try expect(false);
^
0 통과; 0 건너뜀; 1 실패.

테스트에서 오류 처리 이해하기

try 키워드는 지그 테스트에서 매우 중요합니다. 이는 오류를 반환할 수 있는 함수를 실행하려고 시도합니다. 오류가 반환되면 해당 오류를 호출자에게 전달합니다.

같은 테스트를 try 키워드 없이 실행해 보세요:

test "정상적으로 컴파일되지 않음" {
    expect(false);
}

이 경우 expect()가 반환할 수 있는 잠재적 오류를 처리하지 않기 때문에 컴파일 오류가 발생합니다.

4부: 초보자를 위한 지그 기초

변수 및 상수

지그에서 변수와 상서는 다음과 같이 정의됩니다:

const std = @import("std");

pub fn main() void {
    // 상수 (변경 불가능)
    const fixed_value = 42;

    // 변수 (변경 가능)
    var changeable_value = 10;
    changeable_value = 20; // 이는 허용됨

    // 타입을 명시적으로 지정할 수 있습니다
    const explicit_integer: i32 = 1234;
    var explicit_float: f64 = 3.14159;

    std.debug.print("고정: {d}, 변경 가능: {d}\\\\n",
        .{fixed_value, changeable_value});
}

기본 데이터 타입

지그에는 여러 가지 기본 데이터 타입이 있습니다:

const std = @import("std");

pub fn main() void {
    // 정수
    const i: i32 = -42;       // 부호 있는 32비트 정수
    const u: u32 = 42;        // 부호 없는 32비트 정수

    // 실수
    const f: f32 = 3.14;      // 32비트 실수
    const d: f64 = 2.71828;   // 64비트 실수

    // 불리언
    const b: bool = true;

    // 문자 및 문자열
    const c: u8 = 'A';                    // 문자 (정수로)
    const s: []const u8 = "Hello, Zig!";  // 문자열 (u8의 슬라이스)

    // 컴파일 시 크기를 아는 고정 크기 배열
    const arr = [5]u8{1, 2, 3, 4, 5};

    std.debug.print("정수: {d}, 실수: {d}\\\\n", .{i, f});
    std.debug.print("문자열: {s}\\\\n", .{s});
}

함수

지그에서 함수는 fn 키워드를 사용하여 정의됩니다:

const std = @import("std");

// 매개변수와 반환 값이 있는 기본 함수
fn add(a: i32, b: i32) i32 {
    return a + b;
}

// 오류를 반환할 수 있는 함수
fn divide(a: f32, b: f32) !f32 {
    if (b == 0) {
        return error.DivisionByZero;
    }
    return a / b;
}

pub fn main() void {
    // 간단한 함수 호출
    const sum = add(5, 3);
    std.debug.print("5 + 3 = {d}\\\\n", .{sum});

    // 오류를 발생시킬 수 있는 함수 호출
    if (divide(10, 2)) |result| {
        std.debug.print("10 / 2 = {d}\\\\n", .{result});
    } else |err| {
        std.debug.print("오류: {}\\\\n", .{err});
    }

    // 오류를 처리하는 또 다른 방법
    const division_result = divide(10, 0) catch |err| {
        std.debug.print("나누기 실패: {}\\\\n", .{err});
        0; // 오류 발생 시 기본 값
    };
    std.debug.print("결과 (또는 기본): {d}\\\\n", .{division_result});
}

결론

지그는 안전성, 명확성 및 유지 보수성을 강조하면서도 저수준 제어를 제공하는 강력한 언어입니다. 오류 처리 및 메모리 관리 접근 방식은 C, C++, Rust와 같은 언어의 흥미로운 대안입니다.

지그 여정을 계속하려면:

  • 공식 지그 문서 탐색하기
  • Discord의 지그 커뮤니티 또는 Ziggit 포럼에 가입하기
  • 더 나은 IDE 통합을 위한 지그 언어 서버 설치하기
  • 작은 프로젝트를 구축하여 실습 경험 쌓기

지그는 계속 발전 중이므로, 언어가 1.0 버전으로 성숙함에 따라 일부 기능이 변경될 수 있음을 기억하세요. 행복한 코딩 되세요!