반응형

zig의 Defer에 대해 다룹니다.

 

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

https://zig.guide/



2024. 4. 12  최초작성




다음 포스트를 참고하여 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/defer




함수나 코드 블록이 종료될 때 실행되어야 하는 코드를 지정할 때 사용됩니다.



현재 블록이 종료될때 실행할 코드를 지정하는 간단한 예제코드를 살펴보겠습니다.

 

const std = @import("std");

pub fn main() void {
    var x: i16 = 5;

    std.debug.print("블록이 시작되기전 x의 값은 {}입니다.\n", .{x});

    {
        // 블록에서 빠져나올때 변수 x의 값에 2를 더하도록 합니다.
        defer x += 2;

        std.debug.print("블록 내에서 x의 값은 {}입니다.\n", .{x});
    }

    std.debug.print("블록에서 빠져나온 후 x의 값은 {}입니다.\n", .{x});
}



실행해보면 블록에서 빠져나오는 순간 defer 문에 있는 코드가 실행되어 x의 값이 2 증가한 것을 볼 수 있습니다.

 

% zig run main.zig

블록이 시작되기전 x의 값은 5입니다.

블록 내에서 x의 값은 5입니다.

블록에서 빠져나온 후 x의 값은 7입니다.




하나의 블록내에서 다수의 defer를 사용하는 경우엔 역순으로 defer에 있는 코드가 실행됩니다.



const std = @import("std");

pub fn main() void {
    var x: f32 = 5; // 정수를 정수로 나눈 값을 저장시 변수의 데이터 타입을 실수로 해야합니다.

    // 실수는 디폴트로 과학적 표기로 출력됩니다.
    std.debug.print("블록이 시작되기전 x의 값은 {}입니다.\n", .{x});

    {
        // 블록에서 빠져나올때 변수 x의 값에 2를 더하도록 합니다.
        defer x += 2;

        // 블록에서 빠져나올때 변수 x의 값을 2로 나누도록 합니다.
        defer x /= 2;

        // 소수점 첫번째 자리까지 출력되도록 합니다.
        std.debug.print("블록 내에서 x의 값은 {d:.1}입니다.\n", .{x});
    }

    // 소수점 두번째 자리까지 출력되도록 합니다.
    std.debug.print("블록에서 빠져나온 후 x의 값은 {d:.2}입니다.\n", .{x});
}



실행하면 defer로 지정된 코드 중, x /= 2가 먼저 실행되고 나서  x += 2가 실행됩니다.

 

% zig run main.zig

블록이 시작되기전 x의 값은 5.0e+00입니다.

블록 내에서 x의 값은 5.0입니다.

블록에서 빠져나온 후 x의 값은 4.50입니다.





defer를 더 이상 사용하지 않는 자원을 해제하는 작업을 할때 사용하면  유용합니다.

예를 들어, 파일을 열고 데이터를 기록한 후 파일을 닫을때 사용할 수 있습니다.



const std = @import("std");


// void 앞에 !를 붙여야 합니다.
pub fn main() !void {

    // 파일을 엽니다.
    const file = try std.fs.cwd().createFile("example.txt", .{});

    // 함수가 종료될때 실행되어 파일을 닫도록 합니다.
    defer file.close();

    // 파일에 데이터를 씁니다.
    try file.writeAll("Hello, Zig!");

}





반응형

'Zig > Zig 강좌' 카테고리의 다른 글

zig 강좌 08 - Switch  (0) 2024.04.20
zig 강좌 06 -함수  (0) 2024.04.10
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