IMCAT.DEV
로그인 가입
Scala 중급 도구

Scala 파일 I/O

Scala 파일 I/O — 중급

파일 I/O

1. 도입 (왜 배워야 하는가)

파일 입출력(I/O)은 소프트웨어 개발에서 매우 중요한 기술입니다. 실제로 많은 프로그램들이 데이터를 파일에 저장하거나 파일에서 불러와야 합니다. 예를 들어, 데이터베이스에 저장하기 전 임시 파일로 데이터를 저장하거나 사용자 설정을 파일로 관리하는 경우가 많습니다.

파일 I/O를 제대로 이해하지 못하면, 데이터 손실이나 프로그램 크래시와 같은 심각한 문제에 직면할 수 있습니다. 파일을 잘못 읽거나 쓸 경우, 원하는 데이터를 잃어버릴 수 있으며, 이는 사용자의 신뢰를 잃게 만들고 궁극적으로 비즈니스에 부정적인 영향을 미칠 수 있습니다.

2. 핵심 개념 설명

파일 I/O의 핵심 개념은 다음과 같습니다:

  1. 파일: 데이터를 저장하는 물리적 매체입니다. 예를 들어, 컴퓨터의 하드 드라이브에 있는 텍스트 문서나 이미지 파일이 있습니다.
  2. 읽기: 파일에서 데이터를 가져오는 과정입니다. 마치 책에서 필요한 정보를 찾는 것과 비슷합니다.
  3. 쓰기: 데이터를 파일에 저장하는 과정입니다. 이는 마치 일기를 쓰는 것과 비슷합니다.
  4. 스트림: 데이터가 흐르는 경로입니다. 읽기와 쓰기가 이루어지는 경로로, 물이 흐르는 파이프와 같습니다.
  5. 용어정의
    파일데이터를 저장하는 물리적 매체
    읽기파일에서 데이터를 읽는 과정
    쓰기데이터를 파일에 저장하는 과정
    스트림데이터가 흐르는 경로

    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)  // 파일 내용을 출력합니다.
      }
    }

    실행 결과

    안녕하세요, 파일 입출력 예제입니다.

    코드 한 줄씩 동작 설명

  6. import java.io._: Java의 입출력 라이브러리를 가져옵니다.
  7. val writer = new PrintWriter(new File("example.txt")): example.txt라는 파일을 생성하고, 쓸 수 있는 객체를 준비합니다.
  8. writer.write("안녕하세요, 파일 입출력 예제입니다."): 해당 파일에 문자열을 씁니다.
  9. writer.close(): 파일 쓰기를 마친 후 파일을 닫습니다.
  10. val source = Source.fromFile("example.txt"): example.txt 파일을 읽기 위한 객체를 준비합니다.
  11. val content = source.getLines().mkString("\n"): 파일의 모든 줄을 읽어와서 하나의 문자열로 만듭니다.
  12. source.close(): 파일 읽기를 마친 후 파일을 닫습니다.
  13. println(content): 읽어온 내용을 콘솔에 출력합니다.
  14. 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. 흔한 실수와 주의사항

  15. 파일 경로 문제
  16. - 잘못된 파일 경로를 지정하면 파일을 찾을 수 없습니다. - 잘못된 코드: Source.fromFile("wrong_path.txt") - 올바른 코드: Source.fromFile("example.txt") (현재 작업 디렉토리 확인)

  17. 파일 닫기
  18. - 파일을 사용한 후 반드시 닫아야 합니다. 그렇지 않으면 리소스 누수 발생. - 잘못된 코드: writer.write("내용") - 올바른 코드: writer.close()를 추가

  19. 예외 처리 부족
  20. - 파일 작업은 오류가 발생할 수 있습니다. 예외 처리를 추가해야 합니다. - 잘못된 코드: val source = Source.fromFile("example.txt") - 올바른 코드:

       try {
         val source = Source.fromFile("example.txt")
         // 파일 작업
       } catch {
         case e: FileNotFoundException => println("파일을 찾을 수 없습니다.")
       } finally {
         source.close()
       }

    6. 정리

    • 파일 I/O는 데이터 저장 및 불러오기 과정으로, 소프트웨어의 기본 기능입니다.
    • 파일을 읽고 쓰는 과정에서 스트림을 활용합니다.
    • 파일 경로, 파일 닫기, 예외 처리와 같은 주의사항을 항상 염두에 두어야 합니다.

다음에 학습하면 좋은 주제는 CSV 파일 처리나 JSON 파일 입출력입니다. 데이터 포맷에 대한 이해가 더 깊어질 것입니다.