zig의 Defer에 대해 다룹니다.
다음 사이트에 있는 Zig 강좌를 따라해보며 포스트를 올려보고 있습니다.
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://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!