학습
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!
코드 한 줄씩 동작 설명
package main: 메인 패키지를 선언합니다.import (...): 필요한 패키지를 가져옵니다.data := []byte(...): 파일에 쓸 데이터를 바이트 배열로 변환합니다.err := ioutil.WriteFile(...): 데이터를 파일에 기록합니다. 성공 시nil반환.if err != nil {...}: 오류가 발생했는지 확인합니다.content, err := ioutil.ReadFile(...): 파일에서 데이터를 읽어옵니다.fmt.Println(string(content)): 읽어온 내용을 출력합니다.- 잘못된 코드:
ioutil.ReadFile("nonexistent.txt") - 올바른 코드:
ioutil.ReadFile("existing.txt") - 주의사항: 파일 경로가 정확한지 항상 확인해야 합니다.
- 잘못된 코드:
f, _ := os.Open("file.txt")(닫지 않음) - 올바른 코드:
defer f.Close() - 주의사항: 파일을 열고 나서 반드시 닫아야 리소스가 해제됩니다.
- 파일 입출력은 데이터를 영구적으로 저장하는 데 필수적입니다.
- Go에서 파일을 읽고 쓰는 기본적인 방법을 이해해야 합니다.
- 실무에서 로그 파일 관리와 설정 파일 읽기는 매우 유용한 패턴입니다.
- 다음에 학습하면 좋은 주제는
JSON 처리와데이터베이스 연결입니다.
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
}