From e1e79330ce2e782e341348d584004b77bd41a131 Mon Sep 17 00:00:00 2001 From: Min Byeong-Guk Date: Tue, 7 Jan 2025 19:48:16 +0900 Subject: [PATCH] add post 2025-01-06 --- _posts/2025-01-04-zig-tutorial-2nd.md | 19 ++++ _posts/2025-01-06-zig-tutorial-4th.md | 125 ++++++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 _posts/2025-01-06-zig-tutorial-4th.md diff --git a/_posts/2025-01-04-zig-tutorial-2nd.md b/_posts/2025-01-04-zig-tutorial-2nd.md index 8271ab2b6..35f59e589 100644 --- a/_posts/2025-01-04-zig-tutorial-2nd.md +++ b/_posts/2025-01-04-zig-tutorial-2nd.md @@ -121,6 +121,25 @@ std.debug.print("{s}, {s}! ({d})\n", .{ arr_a, arr_b, length_ab }); // Hello, World! (10) ``` +### 슬라이싱 + +`시작..끝` 표기로 배열의 일부 범위를 지정할 수 있다. + +```zig +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 diff --git a/_posts/2025-01-06-zig-tutorial-4th.md b/_posts/2025-01-06-zig-tutorial-4th.md new file mode 100644 index 000000000..3227d284e --- /dev/null +++ b/_posts/2025-01-06-zig-tutorial-4th.md @@ -0,0 +1,125 @@ +--- +date: 2025-01-06 00:00:00 +0900 +title: Zig Tutorial - 4일차 +categories: ["language","zig"] +tags: ["tutorial","install","4th-day"] +image: "https://upload.wikimedia.org/wikipedia/commons/b/b3/Zig_logo_2020.svg" +--- + +> Zig 언어 공부를 시작합니다. 설치부터 문법 및 간단한 응용까지 다룹니다. +{: .prompt-tip } + +## 0. 튜토리얼 참고문서 + +- [ziglang 공식문서](https://ziglang.org/documentation/master/) +- [zig.guide](https://zig.guide/getting-started/hello-world) +- [Introduction to Zig](https://pedropark99.github.io/zig-book/) +- [Learning Zig 한글 번역판](https://faultnote.github.io/posts/learning-zig/) + + +## 1. 빠르게 알고 시작해야 할 것들 + +### 주석 + +주석은 가독성을 위해 싱글라인으로 `//..` 만 사용한다. + +- C 의 `/* ... */` 같은 멀티라인(여러줄) 주석이 없다. + +### [외부 모듈 가져오기 `@import`](https://faultnote.github.io/posts/learning-zig/#%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0importing) + +`pub` 키워드로 노출된 함수, 구조체 등을 `@import` 로 가져올 수 있다. + +```zig +// models/user.zig +pub const MAX_POWER = 100_000; + +pub const User = struct { + power: u64, + name: []const u8, +}; +``` + +`models/user.zig` 소스의 `User` 타입을 가져오는 예제이다. + +```zig +const user = @import("models/user.zig"); +const User = user.User; +const MAX_POWER = user.MAX_POWER +``` + +### [함수 Function](https://faultnote.github.io/posts/learning-zig/#%ED%95%A8%EC%88%98functions) + +파이썬의 `__main__` 모듈 처럼 소스 파일마다 실행을 위한 진입점으로 `main()` 을 사용한다. + +- `zig run 파일명.zig` 를 수행하면 main 함수를 찾아 실행한다. + +```zig +const std = @import("std"); + +pub fn main() void { + const sum = add(8999, 2); + std.debug.print("8999 + 2 = {d}\n", .{sum}); +} + +fn add(a: i64, b: i64) i64 { + return a + b; +} +``` + +- `fn` 키워드로 함수임을 명기하고 입력 파라미터와 출력 타입을 정의한다. + - `return` 키워드로 출력값을 정의한다. +- 같은 이름이지만 다른 타입을 정의하는 함수 오버로딩(overloading)은 없다. + +### [구조체](https://faultnote.github.io/posts/learning-zig/#%EA%B5%AC%EC%A1%B0%EC%B2%B4structures) + +구조체는 `.{..}` 표기법으로 정의한다. + +- 필드는 `,`(콤마)로 끝나야 한다. +- 네임스페이스처럼 사용할 수도 있다. +- `class` 처럼 메소드를 갖는 `struct` 로 복합 타입을 정의할 수 있다. + +```zig +pub const User = struct { + power: u64 = 0, + name: []const u8, + + pub const SUPER_POWER = 9000; + + fn diagnose(user: User) void { + if (user.power >= SUPER_POWER) { + std.debug.print("it's over {d}!!!", .{SUPER_POWER}); + } + } + + pub fn init(name: []const u8, power: u64) User { + return User{ + .name = name, + .power = power, + }; + } +}; + + +const user = User{.name = "Goku"}; // no power assigned +``` + +## 문자열 + +(String 타입이 없고) `u8` 의 배열로 정의하고 문자코드는 UTF-8 을 사용한다. + +- `*const [4:0]u8` : null 로 종료되는 길이 4의 문자열 타입 + - `[길이:센티넬]` : **_센티넬_** 은 배열 끝에서 발견되는 특수값을 의미 +- 문자열은 보통 이렇게 정의해 사용한다. ==> `[]const u8` + - 문자열의 null 종결자를 찾을 필요가 없어서 효율적이다. + + +## 9. Review + +- 문자열 정의 방법이 많이 이상하다. (불편하다) + + + 

+ +> **끝!**   읽어주셔서 감사합니다. +{: .prompt-info } \ No newline at end of file