블록이 끝날 때 열린 파일을 닫고, 정리 작업이 실행되는 순서를 확인하세요. 스코프의 정리 작업은 defer로 등록하고, File 하나를 자동으로 닫으려면 using을 쓰세요.
첫 프로그램에서 토파즈를 설치하세요. 파일을 다루려면 실행 환경에 파일 시스템 접근 권한이 있어야 합니다.
정리 순서 확인하기
작업 폴더에 defer-resources.txt를 만드세요. BOM 없는 UTF-8로 저장하고 ready 뒤에 LF 줄바꿈 하나를 넣으세요. 글자 다섯 개와 줄바꿈을 합쳐 유니코드 스칼라 값 여섯 개가 됩니다.
ready같은 폴더에 다음 코드를 defer-resources.tpz로 저장하세요.
function 메모검사(경로: string) -> Result<(), string> {
using 파일 = open(경로)? {
defer { print("body cleanup") }
let 메모 = 파일.read()?
print("note scalars: {메모.scalars().length}")
}
print("resource scope closed")
Ok(())
}
match 메모검사("defer-resources.txt") {
case Ok(_) => print("done")
case Err(메시지) => print("error: {메시지}")
}그 폴더에서 두 명령을 실행하세요.
topaz check defer-resources.tpz
topaz run defer-resources.tpz두 명령 모두 종료 코드 0으로 끝납니다. 프로그램은 다음 순서로 출력합니다.
note scalars: 6
body cleanup
resource scope closed
doneopen(경로)?는 파일을 한 번 엽니다. 열기에 성공하면 using이 파일 닫기를 등록합니다. 이어서 본문의 defer를 등록합니다. 블록을 나갈 때는 나중에 등록한 작업이 먼저 body cleanup을 출력합니다. 파일을 닫은 뒤 resource scope closed를 출력합니다.
스칼라 값 개수가 다르면 텍스트 파일의 인코딩과 줄바꿈을 확인하세요. 파일 열기가 실패하면 작업 폴더에 defer-resources.txt가 있는지, 읽기 권한이 있는지 확인하세요.
정리할 위치 선택하기
| 할 일 | 사용할 형식 |
|---|---|
| 현재 스코프를 나갈 때 호출이나 블록 실행 | defer call 또는 defer { ... } |
하위 블록이 끝날 때 열린 File 하나 닫기 | using 파일 = open(경로)? { ... } |
| 열기·읽기·쓰기 실패 처리 | Result를 match로 처리하거나 반환하고, 호환되는 함수에서는 ?로 전달 |
defer는 자신을 바로 감싸는 가장 안쪽 스코프에 속합니다. 스코프가 끝나면 등록한 순서의 역순으로 실행합니다. return, ?, break, continue로 스코프를 나갈 때도 실행합니다.
using 바인딩은 다시 대입할 수 없고 본문 안에서 보입니다. 클로저가 File 값을 보관해도 using 블록이 끝나면 파일을 닫습니다. 값을 보관한다고 파일을 계속 열어 두지는 않습니다.
작업이 실패했을 때 정리 확인하기
| 실패 | 실행 결과 |
|---|---|
open이 Err 반환 | using이 닫기를 등록하기 전에 ?가 오류를 반환 |
파일.read()가 Err 반환 | ?가 블록을 나가며 정리한 뒤 메모검사에서 오류를 반환 |
| 연산 중 실행 오류 발생 | 실행을 멈추며, 이후 defer와 using의 정리 동작은 정해져 있지 않음 |
실행 오류인 fault는 배열 범위 초과처럼 실행을 멈추는 오류입니다. 지연한 정리 작업에서 실행 오류가 나면 런타임이 기록·수집 방식을 결정합니다. 이 오류를 값으로 잡을 수 없으며, 이미 반환 중인 Err를 바꾸지도 않습니다.
using이 파일을 한 번 닫게 하기
파일은 open(path)로 여세요. File.open(...) 연산은 없습니다. using은 불변인 이름 하나와 File 하나를 받습니다.
파일 닫기는 using에 맡기세요. 본문에서 파일.close()를 호출해도 등록된 닫기 시도는 남습니다. 닫은 파일을 사용하거나 다시 닫을 때의 동작은 실행 대상마다 같다고 정해져 있지 않습니다.
지원하는 리소스 연산 확인하기
using은 File을 지원합니다. 사용자 정의 정리 규칙, 하나의 using에서 여러 리소스 획득, 리소스 이전은 정의하지 않습니다. 비동기 정리, 취소·호스트 예외 이후 정리, 모듈 종료 시 정리도 정의하지 않습니다.
컴파일러가 만드는 실행 대상은 이 규칙을 지키거나 빌드 결과물을 쓰기 전에 프로그램을 거부해야 합니다. 사용할 실행 대상에서 파일 연산을 확인하세요.
단계별 실습은 실패와 리소스에서 진행하세요. 실패 값의 차이는 Null·Option·결과·fault에서, File 메서드는 파일과 리소스에서 찾을 수 있습니다.