[Go] 가볍게 Go 입문하기 ❸ – fmt 패키지를 이용한 텍스트 입출력

Go 입문자를 위한 가볍게 Go 입문하기를 준비했습니다. Go 언어 기본 문법을 알아봅시다. 기초가 튼튼해야 견고한 건축물을 지을 수 있듯 기본 문법을 제대로 익혀야 훌륭한 코드를 짤 수 있습니다. ‘Hello Go World’, ‘변수’, ‘fmt 패키지를 이용한 텍스트 입출력’, ‘연산자’, ‘함수’까지 총 5편으로 정리했습니다.

fmt 패키지를 이용한 텍스트 입출력

mt 패키지를 이용해서 터미널 화면에 텍스트를 출력하는 방법과 키보드로부터 값을 입력받는 방법을 알아봅시다.

 

1. fmt 패키지 소개

fmt 패키지는 구조화된 입출력을 제공하는 패키지입니다. fmt 패키지가 제공하는 Print(), Printf(), Println() 함수로 표준 출력을 할 수 있습니다. 또한 표준 입력을 제공하는 Scan(), Scanf(), Scanln() 함수로 값을 입력받을 수 있습니다.

 

2. 장점

  • 표준 입력과 출력을 손쉽게 구현할 수 있습니다.
  • 다양한 서식을 제공해 효과적으로 표준 입출력을 할 수 있습니다.

 

1. 표준 입출력

프로그램과 사용자는 입력과 출력을 통해서 상호작용을 합니다. 일반적으로 화면에 출력하고 키보드를 통해 입력받습니다. 때로는 화면이 아니라 파일, 프린터, 네트워크로 전송할 수도 있습니다. 또 입력도 키보드가 아닌 네트워크를 통해 받을 수도 있고 파일에서 읽어올 수도 있습니다. 프로그램마다 이런 출력과 입력을 모두 구현해야 한다면 프로그램이 매우 복잡해질 겁니다. 또 화면에 출력하는 프로그램, 프린터로 출력하는 프로그램 등 각 상황에 맞는 프로그램을 따로 만들어야해서 사용하기 번거로울 겁니다. 이때 운영체제가 제공하는 표준 입출력 스트림(Standard Input/Output Stream)을 사용하면 프로그램 내부에서 입력과 출력을 간편하게 처리할 수 있습니다.

표준 입출력을 사용하면 목적지에 상관없이 간편하게 입출력 처리를 할 수 있습니다. Go 언어에서는 fmt 패키지를 사용해서 간편하게 표준 입출력 처리를 할 수 있습니다.

 

 

1.1 fmt 패키지

표준 입출력 기능은 Go 언어 기본 패키지인 fmt에서 제공합니다. Go 언어는 자주 사용하는 기능을 묶어서 패키지로 제공합니다. 패키지에 대해서는 16장 ‘패키지’에서 자세히 다루겠습니다. 지금은 fmt 패키지에서 표준 입출력 기능을 제공한다 정도로만 알고 계셔도 됩니다.

패키지를 사용하려면 import를 사용해서 사용할 패키지를 불러와야 합니다.

 

 

fmt 패키지는 3가지 표준 출력용 함수를 제공합니다.

 

 

package main

import "fmt"

func main() {
  var a int = 10
  var b int = 20
  var f float64 = 32799438743.8297

  fmt.Print("a:", a, "b:", b)               // ❶
  fmt.Println("a:", a, "b:", b, "f:", f)    // ❷
  fmt.Printf("a: %d b: %d f:%f\n", a, b, f) // ❸
}

a:10b:20a: 10 b: 20 f: 3.27994387438297e+10
a: 10 b: 20 f:32799438743.829700

 

❶ Print() 함수를 이용해서 기본 서식에 맞춰 표준 출력을 합니다. “a:”, a, “b:”, b 이렇게 총 4개 값을 함수에 입력해 호출한 결과 a:10b:20이 출력됐습니다. Print() 함수는 출력이 끝나고 개행을 하지 않기 때문에 바로 Println() 함수 출력 결과가 이어집니다. ❷ Println() 역시 기본 서식에 맞춰서 표준 출력을 합니다. 출력값 사이에 공란을 삽입하고 출력이 끝나면 개행한다는 점이 Print() 함수와 다릅니다. a: 10 b: 20 f: 3.27994387438297e+10을 출력하고 나서 개행했습니다. 주목할 점은 f값이 3.27994387438297e+10 지수 형태로 출력됐다는 겁니다. 그 이유는 실숫값의 기본 서식이 %f가 아닌 %g이기 때문입니다.

❸ Printf() 함수는 주어진 사용자 서식에 맞춰서 입력값을 출력합니다. 첫 번째 입력인 “a: %d b:%d f:%f\n”이 출력 서식을 의미합니다. 출력 서식에 입력값들이 들어갈 자리를 만들어주고 각 입력값이 해당 자리에 들어가게 됩니다. 값이 들어갈 자리는 서식 문자를 적어줍니다.

 

 

맨 뒤의 \n은 개행 처리를 하는 특수 문자입니다. Printf() 함수는 출력이 끝난 뒤 자동 개행을 제공하지 않습니다.

 

1.2 서식 문자

Printf() 함수는 다음과 같은 형식으로 사용합니다.

 

Printf(서식 문자열, 인수1, 인수2, ...)

 

첫 번째 인수로 출력할 서식이 옵니다. 서식은 앞 예제와 같이 출력할 내용과 서식 문자의 조합으로 만듭니다. 두 번째 인수부터는 서식에 맞춰 출력할 값들을 넣어줍니다.

서식 문자를 다음 표에 정리해뒀습니다. 서식 문자가 많은데 모두 외울 필요는 없습니다. 자주 사용하는 %d, %f, %s 정도 알면 일단 OK입니다. 어떤 서식 문자를 써야 할지 모를 때는 마법의 서식 문자인 %v를 사용하세요. 그러면 기본 서식에 맞춰서 출력됩니다.

 

▼ 서식지정자

 

1.3 최소 출력 너비 지정

서식 문자를 이용해 출력 너비를 지정하고, 숫자 0으로 빈 칸을 채우고, 왼쪽 정렬을 할 수 있습니다.

  • 최소 출력 너비 지정 : 서식 문자의 %와 타입을 나타내는 문자 사이에 숫자를 넣어서 너비를 지정할 수 있습니다. 예를 들어 %5d는 최소 5칸을 사용해서 정숫값을 출력합니다.
  • 공란 채우기 : 너비 앞에 0을 붙이면 빈자리를 0으로 채웁니다. %05d는 최소 5칸을 사용하 고 공란에 0을 채웁니다.
  • 왼쪽 정렬하기 : 마이너스 -를 붙이면 왼쪽을 기준선 삼아 출력합니다. 이를 이용하면 일정 간격으로 숫자들을 출력할 수 있습니다.

서식 문자를 이용해 출력 최소 너비 지정, 0 채우기, 왼쪽 정렬을 해봅시다.

 

package main

import "fmt"

func main() {
  var a = 123
  var b = 456
  var c = 123456789

  fmt.Printf("%5d, %5d\n", a, b)       // ❶ 최소 너비보다 짧은 값 너비 지정
  fmt.Printf("%05d, %05d\n", a, b)     // ❷ 최소 너비보다 짧은 값 0 채우기
  fmt.Printf("%-5d, %-05d\n", a, b)    // ❸ 최소 너비보다 짧은 값 왼쪽 정렬
  
  fmt.Printf("%5d, %5d\n", c, c)       // ❹ 최소 너비보다 긴 값 너비 지정
  fmt.Printf("%05d, %05d\n", c, c)     // ❺ 최소 너비보다 긴 값 0 채우기
  fmt.Printf("%-5d, %-05d\n", c, c)    // ❻ 최소 너비보다 긴 값 왼쪽 정렬
}

  123, 456
00123, 00456
123 , 456
123456789, 123456789
123456789, 123456789
123456789, 123456789

 

a와 b는 최소 너비보다 짧은 값입니다. c는 최소 너비보다 긴 값입니다.

❶ 최소 너비를 5로 지정했습니다. a와 b는 3칸을 차지해서 최소 너비 5보다 짧습니다. 그래서 공란 2칸이 추가되어 출력됐습니다.

❷ 최소 너비보다 짧은 수의 공란을 0으로 채웠습니다. a, b 각각 의도한 대로 “00123”, “00456”이 출력됐습니다.

❸ 최소 너비보다 짧은 수를 왼쪽 정렬해 출력했습니다. a값 뒤에 공란 2개가 추가되어 “123 ”이 출력됐습니다. 과연 b는 기대한 대로 “45600”으로 출력될까요? 예상과 달리 값 뒤에 공란 두 개가 붙어 “456 ”으로 출력됐습니다. 숫자 뒤에 0이 붙으면 값이 달라지기 때문입니다.

❹, ❺, ❻은 모두 최소 너비보다 긴 값을 서식에 맞춰 출력해보았습니다. 최소 너비보다 긴 값은 모두 지정한 최소 너비가 무시되어 출력됩니다.

 

1.4 실수 소수점 이하 자릿수

실숫값에는 최소 출력 너비뿐 아니라 소수점 이하 자릿수도 지정할 수 있습니다.

  • %f : 실수를 출력합니다. 예를 들어 %5.2f는 최소 너비 5칸에 소수점 이하 값 2개를 출력합 니다.
  • %g : 실수를 정수부와 소수점 이하 숫자를 포함해 출력 숫자를 제한합니다. 만약 정해진 길이 로 정수부 숫자를 모두 표현하지 못하면 지수 표현으로 전환합니다. 기본 숫자 길이는 6개입 니다. 예를 들어 %5.3g는 최소 너비 5칸에 소수점 이하 포함해서 총 숫자 3개로 표현합니다.

%f와 %g를 사용해 실수를 출력해봅시다.

 

package main

import "fmt"

func main() {
  var a = 324.13455
  var c = 3.14

  fmt.Printf("%08.2f\n", a)   // ❶ 최소 너비 8, 소수점 이하 2자리, 0을 채움
  fmt.Printf("%08.2g\n", a)   // ❷ 최소 너비 8, 총숫자 2자리, 0을 채움
  fmt.Printf("%8.5g\n", a)    // ❸ 최소 너비 8, 총숫자 5자리
  fmt.Printf("%f\n", c)       // ❹ 소수점 이하 6자리까지 출력
}

00324.13
03.2e+02
324.13
3.140000

 

❶ %08.2f는 최소 너비 8칸에 소수점 숫자는 2개만 표시하고 공란은 0으로 채우는 서식 문자입니다. 그래서 소수점 이하 값은 2개만 표시되고 총 길이가 소수점 포함 6칸이 되므로 앞에 0이 두개 추가됐습니다.

❷ %08.2g는 총 출력되는 숫자를 2개로 제한합니다. 324.13455의 정수부는 324로 2개로 표현할 수 없기 때문에 지수 표현으로 전환되고 출력되는 숫자는 총 2개만 출력해 3.2e+02로 표현됩니다. 최소 너비는 8칸이지만 3.2e+02는 7칸을 차지해서 한 칸이 남기 때문에 0이 채워집니다.

❸ %8.5g는 총 출력되는 숫자를 5개로 제한합니다. 324.13455의 정수부 숫자는 3개로 5개로 표현 가능하기 때문에 일반적인 실수 형태로 표현되고 총 출력되는 숫자는 5개로 제한되므로 324.13으로 표현됩니다. 앞에 0이 없기 때문에 0을 채우지 않고 대신 두 칸을 띄웁니다.

❹ %f를 하면 디폴트로 소수점 이하 숫자 6개가 표현됩니다. 즉 %f는 %.6f와 같습니다. 그래서 3.140000이 출력됩니다.

서식 문자, 출력 너비, 소수점 이하 숫자 제한 등이 쉽지 않을 겁니다. 많이 사용되는 기능은 아니므로 지금은 ‘이런 기능이 있다’ 정도로 알고 넘어 갑시다. 나중에 특정 자릿수에 맞춰서 출력해야 하는 경우가 생길 때 fmt 패키지 문서를 참고하기 바랍니다.

 

1.5 특수 문자

\n은 줄바꿈을 하는 특수한 목적의 문자입니다. 특수 문자가 줄바꿈 문자뿐일까요? 탭을 삽입하는 문자 \t, \ 자체를 출력하는 문자 \\, 큰따옴표를 출력하는 특수 문자 \”도 있습니다.

 

 

특수 문자를 포함한 문자열을 표시합시다.

 

package main

import "fmt"

func main() {
  str := "Hello\tGo\t\tWorld\n\"Go\"is Awesome!\n" // ❶ 문자열

  fmt.Print(str)            // ❷ 문자열을 기본 서식으로 출력
  fmt.Printf("%s", str)     // ❸ 문자열을 %s 서식으로 출력
  fmt.Printf("%q", str)     // ❹ 문자열을 %q 서식으로 출력
}

 

각 출력을 살펴보기에 앞서 ❶ str을 살펴보겠습니다.

str값은 다음처럼 여러 개의 특수 문자를 포함합니다. 문자열 자체가 따옴표 “ ”로 묶여 있기 때문에 문자열 내부에 따옴표를 표시하려면 아래처럼 역슬래시를 쓰고 따옴표를 해야 합니다.

 

 

2. 표준 입력

표준 입력은 표준 입력 장치에서 데이터를 얻어옵니다. 일반적으로 표준 입력을 변경하지 않았다면 키보드가 표준 입력 장치입니다. fmt 패키지는 표준 입력으로부터 입력받는 Scan(), Scanf(), Scanln() 함수를 제공합니다.

 

 

2.1 표준 입력 실습 방법 안내

비주얼 스튜디오 코드에서는 키보드 입력을 받는 모든 예제를 터미널에서 실행해야 합니다. 이번 절 예제뿐 아니라 키보드 입력을 받는 모든 예제는 다음 절차를 따라 실행해주세요.

 

To Do 표준 입력을 사용하는 예제 코드 실습 방법

  1. 비주얼 스튜디오 코드 메뉴 [Terminal] → [New Terminal]을 선택합니다(윈도우 단축키 Ctrl+Shift+`).
  2. 만약 터미널의 현재 폴더가 예제 폴더가 아니면 cd ch5\ex5.5 명령으로 현재 폴더를 예제 폴더로 이동합니다.
  3. go mod init ch5\ex5.5 명령으로 모듈을 생성합니다.
  4. go build 명령으로 빌드해서 실행 파일을 만듭니다.
  5. \ex5.5.exe 명령을 실행해서 예제를 실행합니다.

 

2.2 Scan()

Scan() 함수는 값을 채워넣을 변수들의 메모리 주소를 인수로 받습니다. 한 번에 여러 값을 입력 받을 때는 변수 사이를 공란을 두어 구분합니다( enter 키도 공란으로 인식합니다).

 

func Scan(a ...interface{}) (n int, err error)

 

함수 반환값은 성공적으로 입력한 값 개수와 입력 실패 시 에러를 반환합니다.

Scan()을 이용해서 숫자값 2개를 입력받는 예제를 살펴봅시다.

 

package main

import "fmt"

func main() {
  var a int                     // ❶ 값을 저장할 변수
  var b int

  n, err := fmt.Scan(&a, &b)    // ❷ 입력 두 개 받기
  if err != nil {               // ❸ 에러가 발생하면 에러 코드 출력
    fmt.Println(n, err)
  } else {                      // ❹ 정상 입력되면 입력값 출력
    fmt.Println(n, a, b)
  }
}

3 4 ❺ 정상 입력
2 3 4
Hello 4 ❻ 비정상 입력
0 expected integer
4 Hello ❼ 비정상 입력
1 expected integer

 

❶ 입력받은 값을 저장할 a와 b 두 int 타입 정수를 선언합니다.

❷ fmt.Scan() 함수로 공란으로 구분된 숫자 2개를 입력받아서 정수 타입 변수 a와 b에 채워줍니다. Scan() 함수의 입력으로 쓸 때는 변수 앞에 &를 붙여서 변수의 메모리 주소를 입력으로 넘겨야 합니다(&은 14장 ‘포인터’ 참조). 반환값 n은 성공적으로 입력한 값 개수이고 err은 입력 시 발생한 에러를 반환합니다.

❸ err가 nil이 아니면 에러입니다. 에러가 발생했다면 에러값을 출력합니다.

❹ 정상적으로 입력을 받았다면 받은 값을 출력합니다.

코드를 구현했으니 입력에 따라 출력이 어떻게 처리되는지 살펴봅시다.

❺ 3 4를 입력해 n에 2가 입력되고 a는 3, b는 4가 입력됐습니다.

❻ Hello 4를 입력했습니다. 첫 번째 값이 숫자가 아니기 때문에 n은 0이 되고 에러 메시지는 expected integer가 됩니다. n이 1이 아니고 0인 이유는 첫 번째 입력을 잘못 입력하면 두 번째 입력을 받지 않고 함수가 에러를 반환하기 때문입니다.

❼ 4 Hello를 입력한 경우 첫 번째 값으로 4를 제대로 입력했지만 두 번째 값에 문자열을 입력했기 때문에 n은 1이 되고 역시 에러 메시지는 expected integer가 됩니다.

 

2.3 Scanf()

Scanf() 함수는 서식에 맞춘 입력을 받습니다.

 

func Scanf(format string, a ...interface{}) (n int, err error)

 

예를 들어 fmt.Scanf(“%d %d\n”, &a, &b)라고 하면 숫자 하나와 공란 그리고 다른 숫자 하나와 한 줄 띄우기에 맞춰진 입력을 받습니다. 서식에 맞춰서 입력하기가 힘들기 때문에 Scan()이나 Scanln() 함수 사용을 추천합니다.

Scanf()를 이용해서 숫자 2개를 입력받는 예제를 살펴봅시다.

 

package main

import "fmt"

func main() {
  var a int
  var b int

  n, err := fmt.Scanf("%d %d\n",&a, &b) // ❶ 입력 두 개 받기
  if err != nil {
    fmt.Println(n, err)
  } else {
    fmt.Println(n, a, b)
  }
}

3 4 ❷ 정상 입력
2 3 4
Hello 4 ❸ 비정상 입력
0 expected integer
4 Hello ❹ 비정상 입력
1 expected integer

❶ Scanf() 함수를 이용해서 정숫값 두 개를 입력 받습니다. 서식에 맞춰서 두 숫자 사이에 공란 이 와야 합니다.

❷ 두 정숫값을 제대로 입력한 경우 입력받은 개수인 2와 입력받은 값들을 출력합니다.

❸ 비정상 입력한 경우 입력받은 개수는 0이고 에러 메시지가 출력됩니다.

❹ 2.2 예제와 마찬가지로 첫 번째 값은 숫자이지만 두 번째 값이 숫자가 아니라서 에러 메시지 가 출력됩니다. 첫 번째 값은 정상적으로 읽어서 n값은 1이 됩니다.

 

2.4 Scanln()

Scanln() 함수는 한 줄을 입력받아서 인수로 들어온 변수 메모리 주소에 값을 채워줍니다.

 

func Scanln(a ...interface{}) (n int, err error)

 

Scan()과 다른 점은 마지막 입력값 이후 반드시 enter 키로 입력을 종료해야 한다는 점입니다. 예를 들어 아래 예제처럼 값을 두 개 입력받을 때는 두 값을 입력한 뒤 반드시 enter 키로 입력해야 합니다.

Scanln()를 이용해서 숫자 2개를 입력받는 예제를 살펴봅시다.

 

package main

import "fmt"

func main() {
  var a int
  var b int

  n, err := fmt.Scanln(&a, &b)  // ❶ 값을 입력받습니다.
  if err != nil {               // 에러 발생 시
    fmt.Println(n, err)         // 에러를 출력합니다.
  } else {
    fmt.Println(n, a, b)
  }
}

3 4 ❷ 정상 입력
2 3 4
Hello 4 ❸ 비정상 입력
0 expected integer
4 Hello ❹ 비정상 입력
1 expected integer

 

❶ fmt.Scanln() 함수로 표준 입력으로 한 줄을 입력받아서 공란으로 구분된 값들을 읽습니다. 코드를 구현했으니 입력에 따라 출력이 어떻게 처리되는지 살펴봅시다.

❷ 3 4를 입력해 n에 2가 입력되고 a는 3, b는 4가 입력됐습니다.

❸ Hello 4를 입력했습니다. 첫 번째 값이 숫자가 아니기 때문에 n은 0이 되고 에러 메시지는 expected integer가 됩니다. n이 1이 아니고 0인 이유는 첫 번째 입력을 잘못 입력하면 두 번 째 입력을 받지 않고 함수가 에러를 반환하기 때문입니다.

❹ Hello를 입력한 경우 첫 번째 값으로 4를 제대로 입력했지만 두 번째 값에 문자열을 입력했 기 때문에 n은 1이 되고 역시 에러 메시지는 expected integer가 됩니다.

 

5. 키보드 입력과 Scan() 함수의 동작 원리

사용자가 표준 입력 장치(PC에서는 키보드)로 입력하면 입력 데이터는 컴퓨터 내부에 표준 입력스트림(Standard input Stream)이라는 메모리 공간에 임시 저장됩니다. Scan() 함수들은 그 표준 입력 스트림에서 값을 읽어서 입력값을 처리합니다.

표준 입력 스트림에서 스트림이란 흐름이란 뜻을 가지고 있습니다. 즉, 입력 데이터가 연속된 데이터 흐름 형태를 가지고 있다는 뜻입니다. 흘러간 물이 다시 흘러오지 않듯이 한 번 읽은 데이터를 다시 읽을 수는 없습니다. 데이터가 A 포인트에서 B 포인트로 흘러간다고 해서 파이프(Pipe)라고 부르기도 합니다. 표준 입력 스트림의 작동 원리를 살펴보겠습니다.

 

var a, b int
fmt.Scanln(&a, &b)

 

위와 같이 두 int 타입 입력을 받고자 할 때 사용자가 “Hello 4”를 입력하고 enter 키를 누르면 표준 입력 스트림에는 다음 그림과 같이 데이터가 저장됩니다.

 

 

이때 가장 먼저 입력한 데이터부터 읽어오기 때문에 데이터가 거꾸로 저장됩니다. 먼저 입력된 데이터가 먼저 읽히는 데이터 구조를 FIFO(First In First Out)라고 말합니다. 표준 입력 스트림은 바로 FIFO 구조를 가지고 있습니다.

Scan() 함수는 먼저 표준 입력 스트림에서 한 글자를 읽어옵니다. 가장 먼저 입력된 글자가 먼저 읽히기 때문에 ‘H’를 읽어옵니다. 한 번 읽은 데이터는 다시 읽어올 수 없기 때문에 표준 입력 스트림에서 한 글자를 빼온다고 생각할 수 있습니다.

그런 다음 읽어온 글자가 원하는 타입인지 판단합니다. 이 경우 int 타입을 원했지만 ‘H’는 숫자가 아니기 때문에 Error를 반환합니다.

 

표준 입력 스트림에서 한 글자만 읽어왔기 때문에 표준 입력 스트림에는 “ello 4\n” 데이터가 그대로 남아있습니다. 그 상태에서 다시 Scanln()이 호출됐을 때 새로운 입력을 받는 게 아니라 기존에 남아 있는 표준 입력 스트림에서 다시 값을 가져오기 때문에 ‘e’를 가져오게 되고 역시 숫자가 아니기 때문에 또 다시 바로 에러를 반환하게 됩니다.

그래서 여러 번 Scan() 함수를 호출할 때 위와 같은 문제에서 벗어나려면 입력에 실패한 경우 표준 입력 스트림을 지워야 합니다.

Scanln() 함수가 실패한 경우 표준 입력 스트림을 비워주는 예제를 살펴봅시다.

 

package main

import (
    "bufio"    // ❶ io를 담당하는 패키지
    "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(err)              // 에러 출력
    stdin.ReadString('\n')        // ❸ 표준 입력 스트림 지우기
  } else {
    fmt.Println(n, a, b)
  }
  n, err = fmt.Scanln(&a, &b)     // ❹ 다시 입력받기
  if err != nil {
    fmt.Println(err)
  } else {
    fmt.Println(n, a, b)
  }
}

Hello 4 ❺ 문자열과 숫자 입력
1 expected integer ❻ 출력 결과
3 4 ❼ 숫자 두 개 입력
2 3 4 ❽ 출력 결과

 

❶ 표준 입력 스트림에서 한 줄을 읽어오는 데 bufio, os 등의 패키지를 사용했습니다. bufio는 입력 스트림으로부터 한 줄을 읽는 Reader 객체를 제공합니다.

 

func NewReader(rd io.Reader) *Reader

 

❷ NewReader() 함수는 인수로 입력되는 입력 스트림을 가지고 Reader 객체를 생성해줍니다. 여기서는 표준 입력 스트림을 나타내는 os.Stdin을 사용해서 Reader 객체를 만들겠습니다.

❸ 줄바꿈 문자가 나올 때까지 읽습니다. 이렇게 하면 표준 입력 스트림이 비워집니다.

❹ 이제 다시 키보드 입력을 받을 수 있게 됐습니다.

ㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊㅊ

fmt 패키지를 이용한 텍스트 입출력 핵심 요약

  1. fmt 패키지를 이용해서 데이터를 표준 입출력을 할 수 있습니다.
  2. 표준 출력 함수로는 Print(), Printf(), Println()이 있습니다.
  3. 서식 문자를 이용하면 다양한 형식으로 출력할 수 있습니다. 최소 출력 너비와 소숫점 이하 숫자 개수를 지정할 수 있습니다.
  4. 서식 문자 %v를 사용하면 모든 타입의 기본 서식으로 출력합니다.
  5. 표준 입력 함수로는 Scan(), Scanf(), Scanln()이 있습니다.
  6. 입력받을 때 에러가 발생하면 표준 입력 스트림을 지웁시다.

 

다음편에서 계속 됩니다.

WRITER

공봉식

13년 차 게임 서버 프로그래머로 다양한 장르의 온라인 게임을 개발했습니다. 넥슨과 네오위즈를 거쳐서 현재는 EA 캐나다에서 근무 중입니다. 「Tucker Programming」 유튜브 채널을 운영합니다.

Leave a Reply

©2020 GoldenRabbit. All rights reserved.
상호명 : 골든래빗 주식회사
(04051) 서울특별시 마포구 양화로 186, 5층 512호, 514호 (동교동, LC타워)
TEL : 0505-398-0505 / FAX : 0505-537-0505
대표이사 : 최현우
사업자등록번호 : 475-87-01581
통신판매업신고 : 2023-서울마포-2391호
master@goldenrabbit.co.kr
개인정보처리방침
배송/반품/환불/교환 안내