출력 함수 사용하기

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

GUI가 아닌 명령줄 프로그램을 작성한다면 가장 많이 사용하게 되는 출력 방법이 콘솔(터미널)에 글자를 출력하는 표준 출력입니다. 이번에는 Go 언어의 기본적인 입출력 방법을 알아보겠습니다.

다음은 fmt 패키지에서 제공하는 표준 출력 함수입니다.

  • func Print(a …interface{}) (n int, err error): 값을 그 자리에 출력(새 줄로 넘어가지 않음)
  • func Println(a …interface{}) (n int, err error): 값을 출력한 뒤 새 줄로 넘어감(개행)
  • func Printf(format string, a …interface{}) (n int, err error): 형식을 지정하여 값을 출력

먼저 가장 많이 사용하는 fmt.Println 함수를 알아보겠습니다.

package main

import "fmt"

func main() {
	var num1 int = 10
	var num2 float32 = 3.2
	var num3 complex64 = 2.5 + 8.1i
	var s string = "Hello, world!"
	var b bool = true
	var a []int = []int{1, 2, 3}
	var m map[string]int = map[string]int{"Hello": 1}
	var p *int = new(int)
	type Data struct{ a, b int }
	var data Data = Data{1, 2}
	var i interface{} = 1

	fmt.Println(num1) // 10: 정수 출력
	fmt.Println(num2) // 3.2: 실수 출력
	fmt.Println(num3) // (2.5+8.1i): 복소수 출력
	fmt.Println(s)    // Hello, world!: 문자열 출력
	fmt.Println(b)    // true: 불 출력
	fmt.Println(a)    // [1 2 3]: 슬라이스 출력
	fmt.Println(m)    // map[Hello:1]: 맵 출력
	fmt.Println(p)    // 0xc0820062d0: 포인터(메모리 주소) 출력
	fmt.Println(data) // {1 2}: 구조체 출력
	fmt.Println(i)    // 1: 인터페이스 출력

	fmt.Println(num1, num2, num3, s, b) // 10 3.2 (2.5+8.1i) Hello, world! true
	fmt.Println(p, a, m)                // 0xc0820062d0 [1 2 3] map[Hello:1]
	fmt.Println(data, i)                // {1 2} 1
}

실행 결과

10
3.2
(2.5+8.1i)
Hello, world!
true
[1 2 3]
map[Hello:1]
0xc082006270
{1 2}
1
10 3.2 (2.5+8.1i) Hello, world! true
0xc082006270 [1 2 3] map[Hello:1]
{1 2} 1

지금까지 코드를 설명할 때 fmt.Println 함수를 자주 사용했습니다. 이 함수는 표준 출력(stdout)에 값을 한 줄로 출력합니다. 따라서 값 또는 변수를 여러 개 지정해도 모두 한 줄로 출력됩니다. 또한, 모든 형태의 값과 변수를 출력할 수 있습니다. 배열(슬라이스), 맵, 포인터, 구조체, 인터페이스 등도 간단하게 출력할 수 있습니다.

fmt.Print 함수는 fmt.Println 함수와 동일하지만 새 줄로 넘어가지 않고 값을 그 자리에 출력합니다. 따라서 다음과 같이 fmt.Print 함수로 값을 여러 번 출력해도 모든 값이 붙어서 출력됩니다.

fmt.Print(1)
fmt.Print(4.5)
fmt.Print("Hello, world!")
fmt.Print(true)

실행 결과

14.5Hello, world!true

각 값을 새 줄에 출력하려면 fmt.Print(1, “\n”)와 같이 개행 문자(\n)를 넣어줍니다.

이번에는 출력 형태를 직접 정할 수 있는 fmt.Printf 함수입니다.

package main

import "fmt"

func main() {
	var num1 int = 10
	var num2 float32 = 3.2
	var num3 complex64 = 2.5 + 8.1i
	var s string = "Hello, world!"
	var b bool = true
	var a []int = []int{1, 2, 3}
	var m map[string]int = map[string]int{"Hello": 1}
	var p *int = new(int)
	type Data struct{ a, b int }
	var data Data = Data{1, 2}
	var i interface{} = 1

	fmt.Printf("정수: %d\n", num1)     // 정수: 10
	fmt.Printf("실수: %f\n", num2)     // 실수: 3.2
	fmt.Printf("복소수: %f\n", num3)   // 복소수: (2.500000+8.100000i)
	fmt.Printf("문자열: %s\n", s)      // 문자열: Hello, world!
	fmt.Printf("불: %t\n", b)          // 불: true
	fmt.Printf("슬라이스: %v\n", a)    // 슬라이스: [1 2 3]
	fmt.Printf("맵: %v\n", m)          // 맵: map[Hello:1]
	fmt.Printf("포인터: %p\n", p)      // 포인터: 0xc0820062d0 (메모리 주소)
	fmt.Printf("구조체: %v\n", data)   // 구조체: {1 2}
	fmt.Printf("인터페이스: %v\n", i)  // 인터페이스: 1

	fmt.Printf("%d %f %s\n", num1, num2, s) // 10 3.200000 Hello, world!
}

실행 결과

정수: 10
실수: 3.200000
복소수: (2.500000+8.100000i)
문자열: Hello, world!
불: true
슬라이스: [1 2 3]
맵: map[Hello:1]
포인터: 0xc082006270
구조체: {1 2}
인터페이스: 1
10 3.200000 Hello, world!

fmt.Printf 함수의 첫 번째 매개변수에 출력할 형식(format)을 지정해줍니다. 그리고 두 번째 매개변수부터는 출력할 값 또는 변수를 나열합니다. 여기서 % (형식 지정자)로 값을 출력할 위치와 타입을 정하며 %의 개수와 변수 또는 값의 개수가 같아야 합니다.

형식은 자유자재로 구성할 수 있으며 형식안에 개행 문자(\n)를 넣으면 다음 줄로 넘어갑니다.

다음은 형식지정자의 종류입니다.

종류 설명
%v 모든 값을 사용할 수 있는 기본 지정자이며 슬라이스, 맵, 포인터, 구조체, 인터페이스 등에 사용됩니다. %+v처럼 +를 붙이면 구조체의 필드도 함께 표시합니다.
fmt.Printf("%+v\n", data) // {a:1 b:2}
%#v 타입과 값을 함께 표현합니다.
fmt.Printf("%#v\n", m)    // map[string]int{"Hello":1}
fmt.Printf("%#v\n", a)    // []int{1, 2, 3}
fmt.Printf("%#v\n", data) // main.Data{a:1, b:2}
%T 타입을 표현합니다.
fmt.Printf("%T\n", num1) // int
fmt.Printf("%T\n", m)    // map[string]int
fmt.Printf("%T\n", a)    // []int
fmt.Printf("%T\n", data) // main.Data
%% 아무 값도 표현하지 않고, % 문자를 그대로 출력합니다.
%t 불을 표현합니다.
%b 2진수를 표현합니다.
%c 유니코드로 된 문자 하나를 표현합니다.
fmt.Printf("%c %c\n", 'a', '한') // a 한
%d 10진수를 표현합니다.
%o 8진수를 표현합니다.
%q 문자열을 escape하여 표현합니다(특수문자를 문자 그대로 표현하기 위해 문자 앞에 역슬래시를 붙이는 작업을 escape라고 합니다).
fmt.Printf("%q\n", `"Hello, world!" "안녕"`) // "\"Hello, world!\" \"안녕\""
%x 숫자와 영문 소문자로 16진수를 표현합니다.
%X 숫자와 영문 대문자로 16진수를 표현합니다.
%U 유니코드 형식으로 표현합니다.
fmt.Printf("%U\n", '\ud55c') // U+D55C
%b 실수를 2의 제곱으로 표현합니다.
var num2 float32 = 3.2
fmt.Printf("%b\n", num2) // 13421773p-22
%e 실수를 부동소수점으로 표현하고 e는 소문자입니다.
var num2 float32 = 3.2
fmt.Printf("%e\n", num2) // 3.200000e+00
%E 실수를 부동소수점으로 표현하고 E는 대문자입니다.
var num2 float32 = 3.2
fmt.Printf("%E\n", num2) // 3.200000E+00
%f
%F
실수를 고정소수점으로 표현합니다.
%g
%g
실수에서 지수가 크면 %e, %E로 표현하고, 지수가 작으면 %f, %F로 표현합니다.
fmt.Printf("%g %g\n", 1234567.1234567, 1.2) // 1.2345671234567e+06 1.2
%s 문자열을 표현합니다.
%p 포인터, 채널을 표현하며 앞에 0x가 붙습니다.

표 41-1 Go 언어 형식 지정자

다음은 형식 지정자에 간격, 정밀도를 지정하는 방법입니다.

package main

import "fmt"

func main() {
	fmt.Printf("%3d\n", 1)      //   1
	fmt.Printf("%3d\n", 12345)  // 12345
	fmt.Printf("%03d\n", 1)     // 001
	fmt.Printf("%03d\n", 12345) // 12345

	fmt.Printf("%+d, %d\n", 1, -1) // +1

	fmt.Printf("%9f\n", 1.1234567)   //  1.123457
	fmt.Printf("%09f\n", 1.1234567)  // 01.123457
	fmt.Printf("%.2f\n", 1.1234567)  // 1.12
	fmt.Printf("%9.2f\n", 1234567.0) // 1234567.00
}
  • %3d는 정수를 최소 3칸으로 표현합니다. 1을 출력하면 1 앞에 공백이 2칸 들어갑니다. 3자리수가 넘어가면 공백없이 출력합니다.
  • %03d는 정수를 앞에 0을 넣어 최소 3자리로 표현합니다. 3자리가 넘어가면 0없이 그대로 출력합니다.
  • %+d는 양수일 때 + 기호를 출력합니다.
  • %9.2f는 실수의 정밀도를 표현하며 길이가 9이며 소수점 이하 2자리로 출력합니다.

저작권 안내

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

Published

01 June 2015