iOS 파일 입출력의 기본 이해
소프트웨어 개발자라면 파일을 다루는 방법, 즉 파일에 데이터를 쓰거나 파일로부터 데이터를 읽어오는 작업은 반드시 숙지해야 할 핵심 기술입니다.
이번 포스트에서는 iOS 앱 내에서 파일을 직접 생성하고, 해당 파일에 데이터를 작성한 뒤, 다시 그 파일의 내용을 읽어오는 과정까지 단계별로 살펴보겠습니다.
그럼 바로 시작해 보겠습니다.
1단계 — Xcode 프로젝트 생성
Xcode에서 새 프로젝트를 생성합니다. Single View Application 템플릿을 선택하고, 프로젝트 이름을 "ReadingWritingFile"로 지정합니다.
2단계 — 함수 추가하기
ViewController.swift 파일을 열고 아래와 같이 새로운 함수를 추가합니다.
public func createAndWriteFile() {
}3단계 — 파일 경로 얻기
먼저 파일을 생성하기 위해 문서 디렉터리(Document Directory)의 경로를 가져오고, 파일 경로를 출력해 보겠습니다. createAndWriteFile 함수 안에 아래 코드를 추가합니다.
let fileName = "sample"
let documentDirectoryUrl = try! FileManager.default.url(
for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true
)
let fileUrl = documentDirectoryUrl.appendingPathComponent(fileName).appendingPathExtension("txt")
// 파일 경로 출력
print("File path \(fileUrl.path)")코드 설명: FileManager를 사용해 사용자의 문서 디렉터리 URL을 가져온 뒤, appendingPathComponent와 appendingPathExtension 메서드로 파일명과 확장자(.txt)를 결합하여 최종 파일 경로를 만듭니다.
4단계 — 파일에 데이터 쓰기
이제 실제로 파일에 문자열 데이터를 작성해 보겠습니다. 기존 함수에 아래 코드를 추가합니다.
// 파일에 쓸 데이터
let stringData = "Hello Tutorials Point"
do {
try stringData.write(to: fileUrl, atomically: true, encoding: String.Encoding.utf8)
} catch let error as NSError {
print(error)
}참고: write(to:) 메서드는 throwing 함수이므로 do-catch 구문으로 감싸 에러를 처리하는 것이 좋습니다. atomically 파라미터를 true로 설정하면 임시 파일에 먼저 쓴 후 원본 파일로 교체하므로, 쓰기 도중 오류가 발생해도 파일이 손상되지 않습니다.
5단계 — 전체 함수 확인
지금까지 작성한 코드를 모두 합치면 아래와 같습니다.
// 파일을 생성하고 데이터를 쓰는 함수
public func createAndWriteFile() {
let fileName = "sample"
let documentDirectoryUrl = try! FileManager.default.url(
for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true
)
let fileUrl = documentDirectoryUrl.appendingPathComponent(fileName).appendingPathExtension("txt")
// 파일 경로 출력
print("File path \(fileUrl.path)")
// 파일에 쓸 데이터
let stringData = "Hello Tutorials Point"
do {
try stringData.write(to: fileUrl, atomically: true, encoding: String.Encoding.utf8)
} catch let error as NSError {
print(error)
}
}6단계 — 프로젝트 실행 및 검증
viewDidLoad()에서 새로 만든 메서드를 호출하여 프로젝트를 실행합니다. 콘솔에 출력된 파일 경로를 따라가면 실제 파일이 생성되었는지, 그리고 내용이 올바르게 저장되었는지 확인할 수 있습니다.
7단계 — 파일 읽어오기
이제 저장된 파일의 내용을 읽어보겠습니다. 같은 함수 안에 아래 코드를 추가합니다.
var readFile = ""
do {
readFile = try String(contentsOf: fileUrl)
} catch let error as NSError {
print(error)
}
print(readFile)String(contentsOf:) 초기화 메서드를 사용하면 지정된 파일 경로의 내용을 문자열로 손쉽게 불러올 수 있습니다. 정상적으로 코드가 동작했다면, 콘솔에 앞서 작성한 "Hello Tutorials Point"가 그대로 출력되는 것을 확인할 수 있습니다.

완성된 전체 코드
파일 생성부터 쓰기, 읽기까지 전체 흐름을 담은 최종 코드입니다.
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 뷰 로딩 후 필요한 추가 설정을 여기서 수행합니다.
self.createReadAndWriteFile()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// 재생성 가능한 리소스는 여기서 해제합니다.
}
// 파일을 생성하고 데이터를 쓴 후 다시 읽는 함수
public func createReadAndWriteFile() {
let fileName = "sample"
let documentDirectoryUrl = try! FileManager.default.url(
for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true
)
let fileUrl = documentDirectoryUrl.appendingPathComponent(fileName).appendingPathExtension("txt")
// 파일 경로 출력
print("File path \(fileUrl.path)")
// 파일에 쓸 데이터
let stringData = "Hello Tutorials Point."
do {
try stringData.write(to: fileUrl, atomically: true, encoding: String.Encoding.utf8)
} catch let error as NSError {
print(error)
}
// 파일 내용 읽기
var readFile = ""
do {
readFile = try String(contentsOf: fileUrl)
} catch let error as NSError {
print(error)
}
print(readFile)
}
}마무리
이처럼 FileManager와 String 타입의 기본 메서드만 활용하면 iOS에서도 별도의 외부 라이브러리 없이 간단하게 파일 입출력을 구현할 수 있습니다. 더 나아가 JSON, 이미지 등 다양한 형식의 데이터를 저장할 때도 동일한 원리가 적용되므로, 이 예제를 기반으로 응용해 보시기 바랍니다.