zig의 함수에 대해 다룹니다.
다음 사이트에 있는 Zig 강좌를 따라해보며 포스트를 올려보고 있습니다.
2024. 4. 10 최초작성
다음 포스트를 참고하여 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
zig 강좌 08 - Switch
https://webnautes.tistory.com/2324
이번엔 다음 링크에 있는 내용을 정리해봤습니다.
https://zig.guide/language-basics/functions/
변수의 이름을 정할때 snake_case 방식을 사용하지만 함수의 이름을 정할때에는 camelCase 방식을 사용해야 합니다.
함수를 호출하는 간단한 예제입니다.
const std = @import("std"); // 함수의 선언은 fn으로 시작되고 코드를 중괄호{}로 감싸줍니다. //addFive 함수는 하나의 아규먼트 x를 가지며 데이터 타입은 u32(부호없는 32비트 정수)입니다. // 아규먼트를 적은 괄호 뒤에 함수의 반환값의 데이터 타입이 u32라고 명시하고 있습니다. fn addFive(x: u32) u32 { // 아규먼트 값에 5를 더하여 반환합니다. return x + 5; } pub fn main() void { // 함수의 파라미터로 1을 넘겨주고 결과값을 받아 상수 y에 저장합니다. const y = addFive(1); // 상수 y의 값을 출력하면 6이 출력됩니다. std.debug.print("{}\n", .{y}); } |
실행결과 1에 5를 더한 6이 출력됩니다.
% zig run main.zig
6
모든 함수의 아규먼트는 값을 변경할 수 없으므로 값 변경이 필요하다면 복사본을 생성해야 합니다.
다음처럼 아규먼트 x에 5를 더하도록 하면 에러가 발생합니다.
const std = @import("std"); fn addFive(x: u32) u32 { x = x + 5; return x; } pub fn main() void { const y = addFive(1); std.debug.print("{}\n", .{y}); } |
에러 메시지를 살펴보면 아규먼트 x는 상수이기 때문에 값을 대입할 수 없다고 합니다.
% zig run main.zig
main.zig:4:5: error: cannot assign to constant
x = x + 5;
^
아규먼트로 받은 값을 변경하려면 별도의 변수를 선언해야 합니다.
const std = @import("std"); fn addFive(x: u32) u32 { // 아규먼트 x의 복사본으로 변수 t를 선언합니다. // 데이터 타입을 동일하게 사용할 것이므로 변수 선언시 생략해도 됩니다. var t = x; // 변수 t의 값에 에 5를 더하여 반환합니다. t = t + 5; return t; } pub fn main() void { const y = addFive(1); std.debug.print("{}\n", .{y}); } |
실행결과는 바로 전과 동일하게 6이 출력됩니다.
% zig run main.zig
6
zig에서도 재귀함수가 가능합니다. 피보나치 수열을 재귀함수로 구현해봅니다.
const std = @import("std"); fn fibonacci(n: u16) u16 { // 재귀적인 함수 호출이 종료됩니다. if (n == 0 or n == 1) return n; // 재귀적으로 함수를 호출합니다. return fibonacci(n - 1) + fibonacci(n - 2); } pub fn main() void { const x = fibonacci(10); std.debug.print("{}\n", .{x}); } |
실행결과 55가 출력됩니다.
% zig run main.zig
55
재귀를 사용하면 최대 스택 크기를 초과하는 것을 컴파일러가 미리 예측할 수 없기 때문에 오버플로우가 발생할 가능성이 있습니다. 이 문제를 해결하는 방법은 추후 다룹니다.
함수의 반환값을 무시하기 위해 다음처럼 변수나 상수대신에 _를 사용할 수 있습니다.
const std = @import("std"); fn fibonacci(n: u16) u16 { if (n == 0 or n == 1) return n; return fibonacci(n - 1) + fibonacci(n - 2); } pub fn main() void { _ = fibonacci(10); std.debug.print("실행결과를 무시했습니다.\n", .{}); } |
실행 결과입니다.
% zig run main.zig
실행결과를 무시했습니다.
'Zig > Zig 강좌' 카테고리의 다른 글
zig 강좌 08 - Switch (0) | 2024.04.20 |
---|---|
zig 강좌 07 - Defer (0) | 2024.04.13 |
zig 강좌 05 - for 문 (0) | 2024.04.06 |
zig 강좌 04 - while 문 (0) | 2024.04.04 |
zig 강좌 03 - if 문 (0) | 2024.04.02 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!