오늘의 학습 목록
✅ fmt 패키지를 이용해 표준 입출력을 해보자!
프로그램과 사용자는 입력과 출력을 통해서 상호작용을 합니다. 일반적으로 입력은 키보드로, 출력은 모니터로 합니다. 하지만 때로는 키보드, 모니터가 아닌 마이크, 프린터기를 이용할 수 있습니다. 프로그램마다 이런 출력과 입력을 모두 구현해야 한다면 정말로 난해할 것 같습니다. 이때 운영체제가 제공하는 표준 입출력을 사용하면 프로그램 내에서 입력과 출력을 간편하게 처리할 수 있습니다. Golang 에서는 fmt 패키지를 사용해서 간편하게 표준 입출력을 처리할 수 있습니다.
표준 입출력이 기능은 Go 언어 기본 패키지인 fmt 에서 제공합니다.
fmt 패키지는 3가지 표준 출력 함수를 제공합니다. import
키워드를 이용해 fmt
패키지를 이용할 수 있습니다.
function | content |
---|---|
fmt.Print() | 함수 입력값들을 출력합니다. |
fmt.Println() | 함수 입력값들을 출력하고 개행합니다. |
fmt.Printf() | 서식에 맞도록 입력값들을 출력합니다. |
fmt.Print() 함수를 이용해서 기본 서식에 맞춰 표준을 출력합니다.
fmt.Print() 함수는 출력이 끝나고 개행을 출력하지 않습니다.
fmt.Println() 함수를 이용해서 기본 서식에 맞춰 표준을 출력합니다.
fmt.Println() 함수는 출력이 끝나고 개행을 출력합니다.
fmt.Printf() 함수는 주어진 사용자 서식에 맞춰서 입력값을 출력합니다.
fmt.Printf() 함수는 아래와 같은 형식으로 작성합니다.
fmt.Printf(서식 문자열, 인수1, 인수2 ...)
%
으로 시작하는 단어는 서식문자라고 지칭하고, 서식문자 순서대로 var1, var2 값이 출력됩니다.
서식 문자 종류는 아래와 같습니다.
서식 문자 | 설명 |
---|---|
%v | 데이터 타입에 맞춰서 기본 형태로 출력합니다. |
%T | 데이터 타입을 출력합니다. |
%t | 불리언을 true/false로 출력합니다. |
%d | 10진수 정수값으로 출력합니다.(정수 타입만 가능) |
%b | 2진수로 출력합니다. |
%c | 유니코드 문자를 출력합니다.(정수 타입만 가능) |
%o | 8진수로 출력합니다. |
%O | 앞에 8진수임을 표현하는 0o를 붙여서 8진수로 값을 출력합니다. |
%x | 16진수로 값을 출력합니다. 10이상 값을 소문자로 표시합니다. |
%X | 16진수로 값을 출력합니다. 10이상 값을 대문자로 표시합니다. |
%e %E | 지수 형태로 실수값을 출력합니다.(실수타입만 가능) |
%f %F | 지수 형태가 아닌 실수값 그대로 출력합니다.(실수 타입만 가능) |
%g %G | 값이 큰 실수값은 지수 형태로 출력하고, 작은 실수값은 그대로 출력합니다. |
%s | 문자열을 출력합니다. |
%q | 특수 문자 기능(escape 문자)을 동작하지 않고 문자열 그대로 출력합니다. |
%p | 메모리 주소값을 출력합니다. |
표준 입력 기능은 Go 언어 기본 패키지인 fmt 에서 제공합니다.
fmt 패키지는 3가지 표준 입력 함수를 제공합니다. import
키워드를 이용해 fmt
패키지를 이용할 수 있습니다.
function | content |
---|---|
fmt.Scan() | 표준 입력에서 값을 입력받습니다. |
fmt.Scanln() | 표준 입력에서 한 줄로 읽어서 값을 입력받습니다. |
fmt.Scanf() | 표준 입력에서 서식 형태로 입력받습니다. |
func Scan(a ...interface{})(n int, err error)
fmt.Scan() 함수는 변수들의 메모리 주소를 인수로 받습니다.
한 번에 여러 값을 입력 받을 때는 변수 사이를 공란을 두어 구분합니다.
func Scanln(a ...interface{}) (n int, err error)
fmt.Scanln() 함수는 한 줄을 입력받아서 들어온 변수 메모리 주소에 값을 채워줍니다.
Scan()과 다른 점은 마지막 입력값 이후 반드시 (enter)키로 입력을 종료해야 합니다!
func Scanf(format string, a ...interface{}) (n int, err error)
fmt.Scanf() 은 서식에 맞춰 입력합니다.
아무래도 서식에 맞춰 입력하다 보니 사용을 많이 하지 않은 편입니다.
사용자가 표준 입력 장치로 입력하면 데이터는 컴퓨터 내부에 표준 입력 스트림 이라는 공간에 임시 저장됩니다. 그리기 Scan() 함수들은 표준 입력 스트림에서 값을 읽어서 함수를 처리하게 됩니다.
표준입력 스트림이란
먼저 스트림이란 흐름이라는 뜻을 가지고 있습니다. 즉, 입력 데이터가 연속된 흐름 형태를 가지고 있다는 뜻입니다. 그러므로 표준입력 스트림이란 데이터가 연속된 흐름 형태를 가진 공간이라고 보면 될 것 같다.
그러면 fmt.Scan() 함수를 이용해 "GO! Good"을 입력하면 다음 그림과 같이 표준 입력 스트림에 저장됩니다.
표준 입력 스트림은 Queue(FIFO) 구조로 데이터를 저장하며, Scan() 함수는 표준 입력 스트림에 있는 글자 하나 하나를 읽어 온뒤 에러를 확인합니다.
여기서 중요한 점은 에러가 나면, 표준 입력 스트림에 안에 있는 값들은 사라지는 것이 아닌 계속해서 보존되어 있습니다. 그러므로 표준 입력 스트림을 비울 필요가 있습니다.
Golang 에서 표준 입력 스트림을 비워주기 위해서는 아래와 같이 작성을 합니다.
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
stdin := bufio.NewReader(os.Stdin) // 표준 입출력 읽는 객체
var a int
var b int
n, err := fmt.Scanln(&a, &b)
if err != nil {
fmt.Println(n, err)
stdin.ReadString('\n') // 줄바꿈 문자가 나오 때까지 읽는다.
} else {
fmt.println(n, a, b)
}
n, err = fmt.Scanln(&a, &b)
if err != nil {
fmt.Println(n, err)
} else {
fmt.Println(n, a, b)
}
}
위처럼 작성해서 표준 입력 스트림을 비울 수 있습니다!
오늘은 한번 fmt 패키지를 이용해 표준 입출력을 해보았습니다.
즐기며 공부하자 오늘 수고하셨습니다.
이 포스팅은 "Tucker의 Go 언어 프로그래밍:Golang 입문부터 고급 기법까지, 재미있는 4가지 프로젝트와 함께"의 책을 기반으로 작성된 글임을 밝힙니다.