표준입출력 - fmt패키지, 포맷팅 방법

HeejinShin·2022년 10월 6일
0

GO

목록 보기
4/10

프로그램 사용자와의 입출력 상호작용

입출력장치

표준입출력

비트스트림

  1. 일반적으로 화면에 출력하고 키보드를 통해 입력받는다.
  2. 화면이 아니라 파일, 프린터, 네트워크로의 상호작용도 가능하다.
  3. 고 언어에서는 이를 표준입출력 스트림으로 간편하게 사용할 수 있다.

    표준입출력 스트림

    	- 프로그램을 입출력하는 방법은 다양하다. 그 중에서 표준이 되는 입출력이란?, 값이 들어오고 나가는 통로는 변함이 없기 때문에 그걸 표준입출력이라 함 (입출력이 되는 통로)     
    • 운영체제가 제공하는 표준입출력 스트림 사용하여 프로그램 내부에서 입출력을 간편하게 처리
    • 비트스트림; 0과 1의 출력 흐름 ; 바이트스트림
    • os 패키지의 Stdin, Stdout, Stderr을 제공
      • 입출력 스트림 처리는 io.Reader, io.Writer 인터페이스로 처리 되는데 fmt 패키지로 간단하게 표준 입출력을 사용 가능

    fmt 패키지

    	import "fmt"
    • Go 언어는 자주 사용하는 기능을 묶어서 패키지로 제공한다. 패키지에 대해서는 나중에 더 자세히 배운다. fmt 패키지에서 표준 입출력을 제공한다 정도로 사용 방법을 익혀두자.
    • Print() -> 함수 입력값들의 출력
    • Println() -> 출력 % 개행 (new line, Enter)
    • Printf() -> Go언어에서의 포맷팅 사용법 , 서식에 맞춰 출력한다

포맷팅, 서식문자

	fmt.Printf("a: %d b: %d f: %f\n", a, b, f )

- % 뒤로 d, d, f에 a, b, f가 들어간다. d는 정수타입만 가능하고 f는 실수타입만 가능하다
- 위 형식들을 서식문자라고 한다.
- %d -> 10진수 정숫값으로 출력 (정수타입만 가능)
- %b -> 2진수로 출력
- %f -> 지수 형태가 아닌 실숫값을 그대로 출력(실수타입만 가능) ; 소숫점 6자리까지 표현
- %v -> 뭐쓸지 모를때 쓸 마법의 서식문자; 데이터 타입에 맞춰서 기본 형태로 출력함
- %s -> 문자열을 출력한다

![](https://velog.velcdn.com/images/lynn_dev_python/post/2daea90e-74f4-4b02-b579-6d7fe1d1f8e8/image.png)

같은 값을 가진 float이 왜 하나는 지수표현이 되고 하나는 실수표현이 되는가

fmt.Println("a:", a, "b:", b, "f:", f)   // 지수표현됨 
fmt.Printf("a: %d b:%d f:%f\n", a, b, f)   // 실수표현됨 
  1. %g로 동작; 첫번째 f는 Println 에 따라 %v 인식되어 %g, 소수부 6자리, 즉 float64의 정해진 자릿수가 넘어가면 지수표현이 되는 것
  2. %f로 동작; 두번째 f는 서식 문자열 %f에 따라 float값을 받아 float 그대로 표현

실수 소수점 이하 자리수

  • %f: 실수를 출력한다. 예를들어 %5.2f는 최소 너비 5칸에 소수점 이하 값 2개를 출력한다.
  • %g: 실수를 정수부와 소수점 이하 숫자를 포함해 출력 숫자를 제한. 만약 정해진 길이가 정수부 숫자를 모두 표현 하지 못할 경우 지수 표현으로 전환.

특수문자

\n : 줄 바꿈
\t : 공백 삽입
// : / 출력
/" : " 출력

표준 입력

func main() {
	var a int 
	var b int 

	n, err := fmt.Scanln(&a, &b)  // a, b 변수의 주소값 ( &) 
	if err != nil {
		fmt.Println(n, err)
	}else {
		fmt.Println(n,a,b)
	}
}

Scanln에 대해서

n, err := fmt.Scanln(&a, &b)
  • Scanln은 결과값으로 정수 n과 에러 err 값을 갖는다
  • 변수명은 아무거나 써도 됨

Scanln은 왜 인자로 a, b 의 주소값 '&'을 받느냐

a, b 에 &가 붙어서 주소값이 쓰인것에 대해서.
a, b 변수가 쓰였으니까 주소가 자동으로 들어가지 않냐. 고에서는
그렇게 안한다. 인자로 쓰이면 우변의 형태로 쓰이는데 ..
우변의 형태로 쓰인다는게 뭔말이냐면 어떤 변수가 좌측에 쓰이면 공간으로 우변에 쓰이면 값으로 쓰이는데, a = 1, sum = a ; 이걸 예시로 들면 a가 첫번째는 1을 담는 메모리 공간으로 쓰인건데 두번째는 sum이라는 메모리 공간에 a라는 값이 담긴 것 처럼.
Go에서는 인자가 우변의 형태로 동작, 항상 값이 들어간다는것. 그래서 주소값을 넣어주기위해서는 '&'를 쓴다.

입력 버퍼

Scanln() 함수를 통해 값을 입력받으면 표준 입력 스트림 (; 입력 버퍼) 에 값이 담긴다. 이 때 값은 'FIFO'구조로 담긴다. 'Hello' 입력시 'olleH' 로 담긴다. "H" 부터 읽어서 숫자 인지 아닌지 판단. 입력 실패시 입력 버퍼를 비우는 작업을 해줘야 함.

  • 키보드로 부터 어떤 값을 입력받을 때는 버퍼를 비워줘야 한다는 것을 기억하자


    os 패키지의 stn 객체

  • std.ReadString('') : (표준 입력값을 받아 읽어 오는데,) 괄호 안 문자가 나올때 까지 읽어 와라

  • 찾고자 하는 값이 나올때 까지 버퍼를 비우려고 사용함.

    bufio 패키지의 NewReader



출처: Tucker의 Go 언어 프로그래밍

profile
Studying Go Lang

0개의 댓글