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

Pyo·2023년 10월 23일
0


이 글은 Tucker의 Go언어 프로그래밍의 fmt 패키지를 이용한 텍스트 입출력를 공부보고 정리한내용이다.

fmt 패키지

fmt 패키지는 구조화된 입출력을 제공하는 패키지이다. Print(),Printf(),Println() 함수를 이용하여 표준 출력을 할수 있고, Scan(),Scanf(),Scanln() 함수를 이용하여 값을 입력받을수 있다.

fmt 패키지

import "fmt"

Go언어는 기본 패키지인 fmt를 통해 표준 입출력 기능을 제공한다. 패키지를 사용하려면 import를 통해 사용할 패키지를 불러온다.

서식 문자

package main

import "fmt"

func main(){
	var a = 123
	fmt.Printf("%d",a)
}

서식 문자는 Printf(),Scanf()에서 사용을 한다. 첫 번째 인수로는 서식이오고, 두 번째 인수부터는 서식에 맞춰 출력할 값들을 넣어서 값을 출력한다. 보통 정수는 %d, 실수는 %f, 문자열은 %s를 사용하고, 어떤 서식인지 알수 없을때는 %v를 사용한다.
타입을 출력하고 싶을때는 %T를 이용한다.

최소 출력 너비 지정

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)
	fmt.Printf("%-5d, %-5d\n", a, b)

	fmt.Printf("%5d, %5d\n", c, c)
	fmt.Printf("%05d, %05d\n", c, c)
	fmt.Printf("%-5d, %-5d\n", c, c)
}

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

최소너비 지정 : 서식문자 %와 타입 사이에 숫자를 넣어서 너비를 지정한다.

공란 채우기 : 너비 앞에 0을 붙여서 최소 너비보다 짧을 경우 0을 채운다.

왼쪽 정렬하기 : -를 붙이면, 최소너비보다 짧을 경우 왼쪽선을 기준선 삼아 정렬한다.

실수 소수점 이하 자릿수

%f : 실수를 출력한다.

-> %5.2f : 최소너비 5칸이고 소수점 이하 값 2개를 출력한다.

%g : 실수를 정수부와 소수점이하 숫자를 포함해 출력 숫자를 제한한다.

-> %5.3g : 최소너비 5칸에 소수점 이하 포함 총 숫자 3개로 표현한다. (기본 숫자 길이 6)

특수문자

\ : 줄바꿈을 한다.

\t : 탭을 삽입한다.

\ : \ 자체를 출력한다.

\" : "를 출력한다. 큰따옴표로 묶인 내를에 따옴표를 넣을때 사용한다.

표준입력

Scan()

표준 입력에서 값을 입력 받는다.

package main

import "fmt"

func main() {
	var a int
	var b int
	n, err := fmt.Scan(&a, &b) // a,b 주소를 입력으로 넘겨야함
	if err != nil {
		fmt.Println(n, err)
	} else {
		fmt.Println(n, a, b)
	}
}

Scanf()

표준 입력에서 서식 형태로 값을 입력 받는다.

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)
	}
}

Scanln()

표준 입력에서 한 줄을 읽어서 값을 입력 받는다.

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)
	}
}

Scan 함수와 Scanln 함수의 차이점은 Scan 함수는 공백이나 개행을 기준으로 변환을 하지만 Scanln은 공백만을 기준으로 변환하며 개행을 만나면 입력 완료로 인지하여 변환 후 결과를 반환한다.

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

데이터는 컴퓨터 내부의 표준입출력 스트림에 저장된다. 표준 입출력 스트림의 구조는 FIFO 구조이다. Scan() 함수는 스트림에서 가장 먼저 입력된 글자를 먼저 읽는다. 한 번 읽은 데이터는 다시 읽어올수 없기때문에 스트림을 비워주어야한다.

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(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)
	}
}

정리

  • fmt 패키지를 이용해서 데이터 표준 입출력을 할수 있다.
  • 표준 출력 함수로는 Print(),Printf(),Println()이 있다.
  • 서식 문자를 이용하면 다양한 형식의 출력이 가능하다.
  • 서식 문자 %v를 사용하면 모든 타입의 기본 서식으로 출력할수 있다.
  • 표준 입력 함수로는 Scan(),Scanf(),Scanln()이 있다.
  • 표준 입력시 에러가 발생하면 표준 입력 스트림을 지우면된다.

참고

https://www.youtube.com/@TuckerProgramming

0개의 댓글