입출력 인터페이스 사용하기

이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07

읽기, 쓰기 인터페이스를 함께 사용하기

지금까지 io.Reader, io.Writer를 각각 따로 사용했는데 이번에는 io.ReadWriter 인터페이스로 읽기/쓰기를 처리해보겠습니다.

io.ReadWriter의 정의는 다음과 같습니다.

type ReadWriter interface {
        Reader
        Writer
}


그림 50-4 io.ReadWriter 인터페이스

즉, io.ReadWriter 인터페이스는 io.Reader, io.Writer 인터페이스를 포함(임베딩)하고 있습니다.

다음은 bufio 패키지에서 제공하는 입출력 인터페이스 함수입니다.

  • func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error): io.Reader에서 문자열 한 줄을 읽어서 바이트 슬라이스로 리턴

이제 io.ReadWriter 인터페이스를 사용하여 파일에 문자열을 쓴 뒤 다시 읽어보겠습니다.

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	file, err := os.OpenFile(
		"hello.txt",
		os.O_CREATE|os.O_RDWR|os.O_TRUNC, // 파일이 없으면 생성,
                                                  // 읽기/쓰기, 파일을 연 뒤 내용 삭제
		os.FileMode(0644))                // 파일 권한은 644
	if err != nil {
		fmt.Println(err)
		return
	}
	defer file.Close() // main 함수가 끝나기 직전에 파일을 닫음

	r := bufio.NewReader(file) // file로 io.Reader 인터페이스를 따르는 읽기 인스턴스 r 생성
	w := bufio.NewWriter(file) // file로 io.Writer 인터페이스를 따르는 쓰기 인스턴스 w 생성

	rw := bufio.NewReadWriter(r, w) // r, w를 사용하여 io.ReadWriter 인터페이스를 따르는
                                        // 읽기/쓰기 인스턴스 생성
	rw.WriteString("Hello, world!") // 읽기/쓰기 인스턴스로 버퍼에 Hello, world! 쓰기
	rw.Flush()                      // 버퍼의 내용을 파일에 저장

	file.Seek(0, os.SEEK_SET)   // 파일 읽기 위치를 파일의 맨 처음(0)으로 이동
	data, _, _ := rw.ReadLine() // 파일에서 문자열 한 줄을 읽어서 data에 저장
	fmt.Println(string(data))   // 문자열로 변환하여 data의 내용 출력
}

bufio.NewReader, bufio.NewWriter 함수를 사용하여 io.Reader, io.Writer 인터페이스를 따르는 읽기, 쓰기 인스턴스를 생성합니다. 그리고 bufio.NewReadWriter 함수에 읽기, 쓰기 인스턴스를 넣으면 io.ReadWriter 인터페이스를 따르는 읽기/쓰기 인스턴스가 생성됩니다.

읽기/쓰기 인스턴스의 WriteString으로 버퍼에 문자열을 쓴 뒤 버퍼의 내용을 파일에 저장합니다. 그 다음에는 파일의 읽기 위치를 맨 앞으로 이동하고, 읽기/쓰기 인스턴스의 ReadLine으로 파일에서 문자열 한 줄을 읽습니다.

이처럼 io.ReadWriter 인터페이스를 사용하면 읽기 및 쓰기 동작을 인스턴스 한 개로 처리할 수 있습니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

01 June 2015