반응형

zig의 함수에 대해 다룹니다.

 

다음 사이트에 있는 Zig 강좌를 따라해보며 포스트를 올려보고 있습니다.

https://zig.guide/



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://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts