학습
Swift 파일 I/O 처리
Swift 파일 I/O 처리 — 중급
Swift 파일 I/O 처리
1. 도입 (왜 배워야 하는가)
파일 I/O(입출력) 처리는 소프트웨어 개발에서 매우 중요한 부분입니다. 사용자 데이터 저장, 로그 기록, 설정 파일 관리 등 다양한 상황에서 파일을 읽고 쓰는 작업이 필요합니다. 예를 들어, 쇼핑몰 애플리케이션에서 사용자의 장바구니 정보를 파일로 저장해두면, 사용자가 다시 방문했을 때 이전 장바구니를 복원할 수 있습니다.
파일 I/O를 잘 다루지 못하면 데이터 손실이나 비효율적인 데이터 관리로 이어질 수 있습니다. 예를 들어, 사용자가 입력한 정보를 일시적으로만 처리하고, 이를 파일로 저장하지 않으면 다음에 애플리케이션을 실행할 때 모든 데이터가 사라져버릴 수 있습니다. 따라서 파일 I/O는 실무에서 필수적으로 익혀야 할 기술입니다.
2. 핵심 개념 설명
파일 I/O
- 정의: 파일 I/O는 소프트웨어가 파일에 데이터를 읽고 쓰는 과정을 의미합니다.
- 비유: 마치 책을 읽고 쓰는 것과 같습니다. 책에서 정보를 읽고, 새로운 내용을 추가하거나 수정하여 다시 책에 기록하는 과정이죠.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| 파일 | 데이터를 저장하는 단위로, 텍스트 또는 이진 데이터로 구성될 수 있음 |
| 경로(Path) | 파일이 저장된 위치를 나타내는 문자열 |
| 읽기(Read) | 파일에서 데이터를 가져오는 작업 |
| 쓰기(Write) | 파일에 데이터를 저장하는 작업 |
3. 기본 코드 예제
파일을 읽고 쓰는 기본적인 예제를 살펴보겠습니다.
파일 쓰기 예제
import Foundation
let filePath = "/path/to/your/file.txt" // 저장할 경로
let content = "안녕하세요, Swift 파일 I/O!" // 저장할 내용
do {
try content.write(to: URL(fileURLWithPath: filePath), atomically: true, encoding: .utf8)
print("파일에 내용이 성공적으로 저장되었습니다.")
} catch {
print("파일 저장 중 오류 발생: \(error)")
}
실행 결과:
파일에 내용이 성공적으로 저장되었습니다.
동작 설명:
import Foundation: 파일 I/O를 위해 Foundation 프레임워크를 가져옵니다.let filePath: 저장할 파일의 경로를 설정합니다.let content: 파일에 저장할 내용을 정의합니다.do { ... } catch { ... }: 오류 처리를 위한 블록을 설정합니다.content.write(...): 지정한 경로에 내용을 저장합니다.do { ... } catch { ... }: 오류 처리를 위한 블록을 설정합니다.String(contentsOf: ...): 지정한 경로에서 내용을 읽어옵니다.- 읽은 내용을 출력합니다.
- 잘못된 경로를 입력하면
FileNotFoundError가 발생합니다. - 잘못된 코드:
- 올바른 코드:
- 파일을 열고 쓰기 후 반드시 닫지 않으면 메모리 누수가 발생할 수 있습니다.
- 잘못된 코드:
- 올바른 코드:
- 파일 I/O는 데이터를 저장하고 읽는 필수적인 과정입니다.
- Swift에서 파일을 다루기 위해서는
FileHandle,String,Data등의 클래스를 사용할 수 있습니다. - 실무에서 사용자 설정, 로그 기록 등 다양한 상황에서 활용됩니다.
- 다음에 학습할 주제로는 JSON 데이터 처리나 비동기 파일 I/O를 추천합니다.
파일 읽기 예제
do {
let readContent = try String(contentsOf: URL(fileURLWithPath: filePath), encoding: .utf8)
print("파일에서 읽은 내용: \(readContent)")
} catch {
print("파일 읽기 중 오류 발생: \(error)")
}
실행 결과:
파일에서 읽은 내용: 안녕하세요, Swift 파일 I/O!
동작 설명:
4. 실전 활용 예제
예제 1: 사용자 설정 저장
애플리케이션에서 사용자 설정을 파일에 저장하는 경우:
let userSettings = ["theme": "dark", "fontSize": "14"]
do {
let jsonData = try JSONSerialization.data(withJSONObject: userSettings, options: [])
try jsonData.write(to: URL(fileURLWithPath: "/path/to/settings.json"), options: .atomic)
print("사용자 설정이 저장되었습니다.")
} catch {
print("설정 저장 중 오류 발생: \(error)")
}
예제 2: 로그 기록
서버에서 발생한 이벤트를 로그 파일에 저장하는 경우:
let logMessage = "서버가 시작되었습니다.\n"
let logPath = "/path/to/log.txt"
do {
let fileHandle = try FileHandle(forWritingTo: URL(fileURLWithPath: logPath))
fileHandle.seekToEndOfFile() // 파일 끝으로 이동
fileHandle.write(logMessage.data(using: .utf8)!)
fileHandle.closeFile()
print("로그가 기록되었습니다.")
} catch {
print("로그 기록 중 오류 발생: \(error)")
}
5. 흔한 실수와 주의사항
실수 1: 경로 오류
let filePath = "/wrong/path/to/file.txt"
let filePath = "/correct/path/to/file.txt"
실수 2: 파일 쓰기 후 닫지 않기
let fileHandle = try FileHandle(forWritingTo: URL(fileURLWithPath: logPath))
// fileHandle.closeFile() 누락
let fileHandle = try FileHandle(forWritingTo: URL(fileURLWithPath: logPath))
fileHandle.write(logMessage.data(using: .utf8)!)
fileHandle.closeFile() // 반드시 파일을 닫아야 합니다.