Computer >> 컴퓨터 >  >> 프로그래밍 >> iOS

iOS에서 파일 생성, 데이터 쓰기·읽기 완벽 가이드

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"가 그대로 출력되는 것을 확인할 수 있습니다.

iOS에서 파일 생성, 데이터 쓰기·읽기 완벽 가이드

완성된 전체 코드

파일 생성부터 쓰기, 읽기까지 전체 흐름을 담은 최종 코드입니다.

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, 이미지 등 다양한 형식의 데이터를 저장할 때도 동일한 원리가 적용되므로, 이 예제를 기반으로 응용해 보시기 바랍니다.