Skip to content

Commit

Permalink
add post 2025-01-06
Browse files Browse the repository at this point in the history
  • Loading branch information
maxmin93 committed Jan 7, 2025
1 parent 1c5f8e2 commit e1e7933
Show file tree
Hide file tree
Showing 2 changed files with 144 additions and 0 deletions.
19 changes: 19 additions & 0 deletions _posts/2025-01-04-zig-tutorial-2nd.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
125 changes: 125 additions & 0 deletions _posts/2025-01-06-zig-tutorial-4th.md
Original file line number Diff line number Diff line change
@@ -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

- 문자열 정의 방법이 많이 이상하다. (불편하다)


&nbsp; <br />
&nbsp; <br />

> **끝!** &nbsp; 읽어주셔서 감사합니다.
{: .prompt-info }

0 comments on commit e1e7933

Please sign in to comment.