콘솔 출력과 입력 함수
콘솔 입출력 함수에 대해 더 알아보자.
콘솔 출력함수
다른 언어를 사용해본 개발자들은 printf, 혹은 System.out.println()
와 같은 용법에 익숙할 것입니다.
Go언어에서 사용하는 fmt 패키지의 콘솔 출력 함수는 Println, Print, Printf
외에도 파일 출력을 위한 Fprintln, Fprint, Fprintf
와 string형으로 반환되는 Sprintln, Sprint, Sprintf
가 있습니다. 그리고 Print와 같은 함수들도 사실 반환 값을 갖습니다.
따라서 Println, Print, Printf
함수들이 어떤 특징이 있는지 차이점을 알아보겠습니다.
Println, Print
두 함수는 하나의 인자를 출력할 수도 있고 여러 개의 인자를 콤마로 결합해 열거할 수 있다는 점에서 공통점이 있습니다.
Printf
Printf 함수는 C언어의 Printf 함수와 유사합니다. Go언어에서도 개발자가 포멧을 지정하여 원하는 형태로 출력할 때 사용합니다. 여기서 주의해야 할 점은 반드시 포멧을 지정
해줘야 한다는 것입니다. 그리고 C언어와는 다르게 조금 더 편리한 점은 배열을 한번에 출력
이 가능하다는 것입니다.
package main
import "fmt"
func main() {
age, name := 24, "길동"
fmt.Printf("안녕 난 %s이야\n", name)
fmt.Printf("나이는 %d살이야\n", age)
fmt.Printf("반가워")
n := 14
var arr [5]int = [5]int{1, 2, 3, 4, 5}
fmt.Printf("내 동생은 %d살이야\n", n)
fmt.Printf("%d \n", arr) //배열 한 번에 출력 가능
fmt.Printf("%d %d", n, arr)
}
서식문자
이는 값을 입력하고 출력하는 데 있어서 서식을 지정하는 것입니다. 포멧을 지정할 수 있는 것을 가리켜 '서식문자'
라고 합니다. C언어와는 몇 가지 다른 점이 있습니다. C언어에서는 %u와 %x등
과 같은 부호의 여부에 따라 표현이 다른 서식문자들이 있습니다. 그리고 Go언어에서는 %v 문자
를 이용해 변수의 타입에 관계없이 출력할 수 있습니다. 그리고 포인터 서식문자인 %p
는 값이 참조하는 주소값을 반환하는 서식문자입니다.
출력하는 형태를 따로 지정할 수 있습니다. 원하는 출력 폭을 지정할 때는 "%(폭)d" 형식
으로 입력하고, 지정한 출력 폭에 0을 채워넣고 싶으면 "%0(폭)d"형식
으로 입력하고, 출력할 때 왼쪽부터 출력을 원한다면 "%-(폭)d"형식
으로 입력합니다. 그리고 출력할 소수점 이하 자리를 지정할 때 "%.(자릿수)f"형식
으로 지정할 수 있습니다.
package main
import "fmt"
func main() {
fmt.Printf("5>6=%t\n", 5 > 6)
fmt.Printf("15는 2진수로 %b\n", 15)
fmt.Printf("저의 성은 %c 입니다\n", '김')
fmt.Printf("19는 10진수로 %d입니다.\n", 19)
fmt.Printf("19는 8진수로 %o입니다.\n", 19)
fmt.Printf("19는 16진수로 %x입니다.\n", 19)
fmt.Printf("19는 16진수로 %X입니다.\n", 19)
fmt.Printf("19.1234는 고정 소수점으로 %f입니다.\n", 19.1234)
fmt.Printf("19.1234는 고정 소수점으로 %F입니다.\n", 19.1234)
fmt.Printf("19.1234의 지수 표현은 %e입니다.\n", 19.1234)
fmt.Printf("19.1234의 지수 표현은 %E입니다.\n", 19.1234)
fmt.Printf("19.1234의 간단한 실수 표현은 %g입니다.\n", 19.1234) // 고정 소수점이 아님
fmt.Printf("19.1234의 간단한 실수 표현은 %G입니다.\n", 19.1234) // 고정 소수점이 아님
fmt.Printf("문자열: %s\n", "안녕하세요.")
var num int = 50
fmt.Printf("num은 %d입니다.\n", num)
fmt.Printf("num의 메모리 주소 출력: %p\n", &num) //주솟값을 참조하기 위해 &를 쓴다.
fmt.Printf("num의 유니코드 값은 %U입니다.\n", num)
fmt.Printf("num의 타입은 %T입니다.\n", num)
fmt.Printf("num의 타입은 %T입니다.\n", num)
fmt.Printf("모든 형식으로 출력: %v, %v\n", 54.234, "Hello")
fmt.Printf("num의 타입은 %T입니다.\n", num)
fmt.Printf("7이 어떤 형식인지 표시: %d, %#o, %#x\n", 7, 7, 7) //8진수는 앞에 0이 붙고, 16진수는 0x가 붙습니다.
fmt.Printf("네 칸 차지하는 13: %4d\n", 13)
fmt.Printf("빈칸은 0으로 채우고 4칸 차지하는 13: %04d\n", 13)
fmt.Printf("총 네 칸 차지하고 왼쪽으로 정렬되는 13과 15: %-4d%-4d\n", 13, 15)
fmt.Printf("12.1234를 소수점 둘째 자리까지만 표시하면 %.2f입니다.\n", 12.1234)
}
콘솔 입력 함수
다른 언어를 사용해본 개발자들은 scanf, new Scanner(system.in)
와 같은 용법에 익숙할 것입니다. Go언어의 콘솔 입력 함수는 C언어와 크게 다르지 않습니다.
Go언어는 Scanln, Scan, Scanf 함수
가 있습니다. 각각 어떤 특징이 있는지 차이점을 알아보겠습니다.
Scanln, Scan, Scanf
Scanln 함수
는 데이터를 입력받을 때 공백으로만 구분
할 수 있습니다. 반대로, Scan 함수
는 개행
을 입력(엔터)하는 것 또한 데이터를 구분하는 입력 방식으로 인식됩니다. 그리고 Scanf 함수
는 개발자가 만들어놓은 형식
으로 입력받을 수 있습니다.
예를 들어, 주민등록번호를 입력받기 위해 Scanf("%d-%d", &num1, &num2)
으로 만들었을 때 940101-0000000
이라고 입력하고 엔터를 입력하면 num1에는 940101이, num2에는 0000000
이 입력됩니다.