지그(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!" 예제를 만들어 보겠습니다.
프로그램 파일 만들기
main.zig
라는 이름의 새 파일을 만드세요.- 선호하는 텍스트 편집기로 여세요.
- 다음 코드를 추가하세요:
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부: 지그에서 테스트 실행하기
지그에는 쉽고 효과적인 테스트를 작성하고 실행할 수 있는 내장 테스트 프레임워크가 있습니다. 테스트 사용 방법을 이해하는 것은 지그를 배우는 데 있어 중요합니다. 지그 문서의 많은 예제가 테스트로 제공되기 때문입니다.
통과하는 간단한 테스트 만들기
기본 테스트 파일을 만들어 보겠습니다:
test_pass.zig
라는 이름의 새 파일을 만드세요.- 다음 코드를 추가하세요:
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개의 테스트 통과.
실패하는 테스트 만들기
이제, 테스트 실패를 이해하기 위해 실패하는 테스트를 만들어 보겠습니다:
test_fail.zig
라는 파일을 만드세요.- 다음 코드를 추가하세요:
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 버전으로 성숙함에 따라 일부 기능이 변경될 수 있음을 기억하세요. 행복한 코딩 되세요!