- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
출력 함수 사용하기
이재홍 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처럼 +를 붙이면 구조체의 필드도 함께 표시합니다.
|
%#v | 타입과 값을 함께 표현합니다.
|
%T | 타입을 표현합니다.
|
%% | 아무 값도 표현하지 않고, % 문자를 그대로 출력합니다. |
%t | 불을 표현합니다. |
%b | 2진수를 표현합니다. |
%c | 유니코드로 된 문자 하나를 표현합니다.
|
%d | 10진수를 표현합니다. |
%o | 8진수를 표현합니다. |
%q | 문자열을 escape하여 표현합니다(특수문자를 문자 그대로 표현하기 위해 문자 앞에 역슬래시를 붙이는 작업을 escape라고 합니다).
|
%x | 숫자와 영문 소문자로 16진수를 표현합니다. |
%X | 숫자와 영문 대문자로 16진수를 표현합니다. |
%U | 유니코드 형식으로 표현합니다.
|
%b | 실수를 2의 제곱으로 표현합니다.
|
%e | 실수를 지수 표기법으로 표현하고 e는 소문자입니다.
|
%E | 실수를 지수 표기법으로 표현하고 E는 대문자입니다.
|
%f %F |
실수를 소수점 형식으로 표현합니다. |
%g %g | 실수에서 지수가 크면 %e, %E로 표현하고, 지수가 작으면 %f, %F로 표현합니다.
|
%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 공유는 허용합니다.