학습
Scala 파일 I/O
Scala 파일 I/O — 중급
파일 I/O
1. 도입 (왜 배워야 하는가)
파일 입출력(I/O)은 소프트웨어 개발에서 매우 중요한 기술입니다. 실제로 많은 프로그램들이 데이터를 파일에 저장하거나 파일에서 불러와야 합니다. 예를 들어, 데이터베이스에 저장하기 전 임시 파일로 데이터를 저장하거나 사용자 설정을 파일로 관리하는 경우가 많습니다.
파일 I/O를 제대로 이해하지 못하면, 데이터 손실이나 프로그램 크래시와 같은 심각한 문제에 직면할 수 있습니다. 파일을 잘못 읽거나 쓸 경우, 원하는 데이터를 잃어버릴 수 있으며, 이는 사용자의 신뢰를 잃게 만들고 궁극적으로 비즈니스에 부정적인 영향을 미칠 수 있습니다.
2. 핵심 개념 설명
파일 I/O의 핵심 개념은 다음과 같습니다:
- 파일: 데이터를 저장하는 물리적 매체입니다. 예를 들어, 컴퓨터의 하드 드라이브에 있는 텍스트 문서나 이미지 파일이 있습니다.
- 읽기: 파일에서 데이터를 가져오는 과정입니다. 마치 책에서 필요한 정보를 찾는 것과 비슷합니다.
- 쓰기: 데이터를 파일에 저장하는 과정입니다. 이는 마치 일기를 쓰는 것과 비슷합니다.
- 스트림: 데이터가 흐르는 경로입니다. 읽기와 쓰기가 이루어지는 경로로, 물이 흐르는 파이프와 같습니다.
import java.io._: Java의 입출력 라이브러리를 가져옵니다.val writer = new PrintWriter(new File("example.txt")):example.txt라는 파일을 생성하고, 쓸 수 있는 객체를 준비합니다.writer.write("안녕하세요, 파일 입출력 예제입니다."): 해당 파일에 문자열을 씁니다.writer.close(): 파일 쓰기를 마친 후 파일을 닫습니다.val source = Source.fromFile("example.txt"):example.txt파일을 읽기 위한 객체를 준비합니다.val content = source.getLines().mkString("\n"): 파일의 모든 줄을 읽어와서 하나의 문자열로 만듭니다.source.close(): 파일 읽기를 마친 후 파일을 닫습니다.println(content): 읽어온 내용을 콘솔에 출력합니다.- 파일 경로 문제
- 파일 닫기
- 예외 처리 부족
- 파일 I/O는 데이터 저장 및 불러오기 과정으로, 소프트웨어의 기본 기능입니다.
- 파일을 읽고 쓰는 과정에서 스트림을 활용합니다.
- 파일 경로, 파일 닫기, 예외 처리와 같은 주의사항을 항상 염두에 두어야 합니다.
| 용어 | 정의 |
|---|---|
| 파일 | 데이터를 저장하는 물리적 매체 |
| 읽기 | 파일에서 데이터를 읽는 과정 |
| 쓰기 | 데이터를 파일에 저장하는 과정 |
| 스트림 | 데이터가 흐르는 경로 |
3. 기본 코드 예제
아래는 Scala에서 파일을 읽고 쓰는 기본 예제입니다.
import java.io._
object FileIOExample {
def main(args: Array[String]): Unit = {
// 파일에 데이터를 쓰기
val writer = new PrintWriter(new File("example.txt"))
writer.write("안녕하세요, 파일 입출력 예제입니다.")
writer.close() // 파일을 닫습니다.
// 파일에서 데이터를 읽기
val source = Source.fromFile("example.txt")
val content = source.getLines().mkString("\n") // 파일 내용을 한 줄로 가져옵니다.
source.close() // 파일을 닫습니다.
println(content) // 파일 내용을 출력합니다.
}
}
실행 결과
안녕하세요, 파일 입출력 예제입니다.
코드 한 줄씩 동작 설명
4. 실전 활용 예제
예제 1: 쇼핑몰에서 장바구니 저장
장바구니에 담긴 상품 정보를 파일에 저장하여, 사용자가 다음에 방문했을 때 이전 장바구니를 불러올 수 있습니다.
import java.io._
def saveCart(cart: List[String]): Unit = {
val writer = new PrintWriter(new File("cart.txt"))
cart.foreach(writer.println) // 장바구니의 각 상품을 파일에 씁니다.
writer.close()
}
def loadCart(): List[String] = {
val source = Source.fromFile("cart.txt")
val cart = source.getLines().toList // 파일에서 장바구니를 읽어옵니다.
source.close()
cart
}
// 사용 예시
saveCart(List("상품1", "상품2", "상품3"))
val cart = loadCart()
println(cart)
예제 2: 로그 파일 작성
프로그램의 동작을 기록하기 위해 로그 파일을 생성하고, 중요한 이벤트가 발생할 때마다 로그를 남길 수 있습니다.
import java.io._
def logEvent(event: String): Unit = {
val writer = new PrintWriter(new FileWriter("events.log", true)) // true를 주면 추가 쓰기
writer.println(s"${java.time.LocalDateTime.now()}: $event")
writer.close()
}
// 사용 예시
logEvent("사용자가 로그인했습니다.")
logEvent("상품을 장바구니에 추가했습니다.")
5. 흔한 실수와 주의사항
- 잘못된 파일 경로를 지정하면 파일을 찾을 수 없습니다.
- 잘못된 코드: Source.fromFile("wrong_path.txt")
- 올바른 코드: Source.fromFile("example.txt") (현재 작업 디렉토리 확인)
- 파일을 사용한 후 반드시 닫아야 합니다. 그렇지 않으면 리소스 누수 발생.
- 잘못된 코드: writer.write("내용")
- 올바른 코드: writer.close()를 추가
- 파일 작업은 오류가 발생할 수 있습니다. 예외 처리를 추가해야 합니다.
- 잘못된 코드: val source = Source.fromFile("example.txt")
- 올바른 코드:
try {
val source = Source.fromFile("example.txt")
// 파일 작업
} catch {
case e: FileNotFoundException => println("파일을 찾을 수 없습니다.")
} finally {
source.close()
}
6. 정리
다음에 학습하면 좋은 주제는 CSV 파일 처리나 JSON 파일 입출력입니다. 데이터 포맷에 대한 이해가 더 깊어질 것입니다.