콘솔 출력과 입력 함수

콘솔 출력과 입력 함수

콘솔 입출력 함수에 대해 더 알아보자.


콘솔 출력함수


다른 언어를 사용해본 개발자들은 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이 입력됩니다.


© 2022. All rights reserved. 신동민의 블로그