IMCAT.DEV
로그인 가입
Go 중급 자료구조

Go 파일 입출력 (File I/O)

Go 파일 입출력 (File I/O) — 중급

파일 입출력 (File I/O)

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

파일 입출력(File I/O)은 프로그램이 데이터를 영구적으로 저장하고 불러오는 데 필수적인 기능입니다. 예를 들어, 사용자의 입력을 저장하거나, 로그 파일을 생성하거나, 설정 파일을 읽어오는 등의 작업에서 필요합니다. 파일 입출력을 잘 이해하지 못하면 데이터가 사라지거나 프로그램이 비정상적으로 종료되는 문제를 겪을 수 있습니다. 실제로 많은 애플리케이션에서 데이터를 파일로 저장하고 불러오는 과정이므로, 이 과정을 제대로 이해하고 구현하는 것이 중요합니다.

2. 핵심 개념 설명

  • 파일(File): 컴퓨터에 저장된 데이터의 집합으로, 텍스트 파일, 이미지 파일 등 다양한 형태가 있습니다.
  • 입력(Input): 프로그램이 외부 데이터를 파일로부터 읽어오는 과정입니다.
  • 출력(Output): 프로그램이 데이터를 파일로 저장하는 과정입니다.
  • 관련 용어 정리

    용어설명
    파일 경로파일이 저장된 위치를 나타내는 문자열
    열기파일을 읽거나 쓰기 위해 열기
    닫기사용이 끝난 파일을 닫기

    3. 기본 코드 예제

    다음은 Go 언어에서 파일을 읽고 쓰는 가장 기본적인 예제입니다.

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "os"
    )
    
    func main() {
        // 파일에 데이터 쓰기
        data := []byte("Hello, Go File I/O!")
        err := ioutil.WriteFile("example.txt", data, 0644)
        if err != nil {
            fmt.Println("Error writing file:", err)
            return
        }
    
        // 파일에서 데이터 읽기
        content, err := ioutil.ReadFile("example.txt")
        if err != nil {
            fmt.Println("Error reading file:", err)
            return
        }
    
        fmt.Println(string(content)) // Hello, Go File I/O!
    }

    실행 결과

    Hello, Go File I/O!

    코드 한 줄씩 동작 설명

    1. package main: 메인 패키지를 선언합니다.
    2. import (...): 필요한 패키지를 가져옵니다.
    3. data := []byte(...): 파일에 쓸 데이터를 바이트 배열로 변환합니다.
    4. err := ioutil.WriteFile(...): 데이터를 파일에 기록합니다. 성공 시 nil 반환.
    5. if err != nil {...}: 오류가 발생했는지 확인합니다.
    6. content, err := ioutil.ReadFile(...): 파일에서 데이터를 읽어옵니다.
    7. fmt.Println(string(content)): 읽어온 내용을 출력합니다.
    8. 4. 실전 활용 예제

      예제 1: 로그 파일 생성

      쇼핑몰에서 사용자 활동을 기록하기 위해 로그 파일을 생성할 때 사용할 수 있습니다.

      package main
      
      import (
          "fmt"
          "os"
          "time"
      )
      
      func logUserActivity(activity string) {
          f, err := os.OpenFile("activity.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
          if err != nil {
              fmt.Println("Error opening file:", err)
              return
          }
          defer f.Close()
      
          logMessage := fmt.Sprintf("%s: %s\n", time.Now().Format(time.RFC3339), activity)
          if _, err := f.WriteString(logMessage); err != nil {
              fmt.Println("Error writing to file:", err)
          }
      }

      예제 2: 설정 파일 읽기

      프로그램의 설정 정보를 외부 파일에서 읽어오는 경우.

      package main
      
      import (
          "encoding/json"
          "fmt"
          "os"
      )
      
      type Config struct {
          Port int json:"port"
          Host string json:"host"
      }
      
      func loadConfig(filePath string) (Config, error) {
          var config Config
          file, err := os.Open(filePath)
          if err != nil {
              return config, err
          }
          defer file.Close()
      
          decoder := json.NewDecoder(file)
          err = decoder.Decode(&config)
          return config, err
      }

      5. 흔한 실수와 주의사항

      실수 1: 파일 경로 오류

    9. 잘못된 코드: ioutil.ReadFile("nonexistent.txt")
    10. 올바른 코드: ioutil.ReadFile("existing.txt")
    11. 주의사항: 파일 경로가 정확한지 항상 확인해야 합니다.
    12. 실수 2: 파일 닫지 않기

    13. 잘못된 코드: f, _ := os.Open("file.txt") (닫지 않음)
    14. 올바른 코드: defer f.Close()
    15. 주의사항: 파일을 열고 나서 반드시 닫아야 리소스가 해제됩니다.
    16. 6. 정리

    17. 파일 입출력은 데이터를 영구적으로 저장하는 데 필수적입니다.
    18. Go에서 파일을 읽고 쓰는 기본적인 방법을 이해해야 합니다.
    19. 실무에서 로그 파일 관리와 설정 파일 읽기는 매우 유용한 패턴입니다.
    20. 다음에 학습하면 좋은 주제는 JSON 처리와 데이터베이스 연결입니다.