TIL 02 - 표준 입출력, 변수 함수(Golang)

프동프동·2023년 2월 10일
0

TIL

목록 보기
1/46
post-thumbnail

표준 입출력

fmt

기본 입출력 관련 패키지

print

콘솔에 출력하기 위해 사용한다

  • fmt.Print()
    • 기능
      • 콘솔에 값을 출력
    • 특징
      • 인자가 2개 이상일 경우 띄어쓰지 않고 출력
  • fmt.Println()
    • 기능
      • 콘솔에 값을 출력
    • 특징
      • 인자가 2개 이상일 경우 띄어쓰고 출력,
      • 자동 개행
  • fmt.Printf()
    • 기능
      • 형식을 지정하여 콘솔에 값을 출력
    • 특징
      • 형식을 지정하여 사용할 수 있다.

Sprint

메모리에 값을 저장하기 위해 사용한다.

  • fmt.Sprint()
    • 기능
      • 메모리에 값을 저장한다.
    • 특징
      • 인자가 2개 이상일 경우 순서대로 붙여서 출력
  • fmt.Sprintln()
    • 기능
      • 메모리에 값을 저장한다
    • 특징
      • 인자가 2개 이상일 경우 인자 간 공백 추가
      • 문자열 끝에 개행 문자 추가
  • fmt.Sprintf()
    • 기능
      • 형식을 지정하여 출력
    • 특징
      • 형식을 지정하여 출력할 수 있다.

Scan

콘솔에서 입력을 받기 위해 사용한다.

  • fmt.Scan()
    • 기능
      • 콘솔에서 입력을 받는 함수
    • Scanln()과 차이점
      • 공백, 개행 기준으로 변환한다
        • 개행을 공백으로 간주한다.
    • Output
      • 성공한 항목 수 반환, 인수 보다 적은 값 입력 시 오류 반환
  • fmt.Scanln()
    • 기능
      • 콘솔에서 입력을 받는 함수
    • Scan()과 차이점
      • 공백을 기준으로 변환, 개행을 만나면 입력 완료로 받아들인다.
    • Output
      • 성공한 항목 수 반환, 인수 보다 적은 값 입력 시 오류 반환
  • fmt.Scanf()
    • 기능
      • 포멧을 지정하여 콘솔에서 입력받는 함수
    • Output
      • 성공한 항목수 반환, 인수 보다 적은 값 입력 시 오류 반환

더 생각해보기

Go 언어에서는 입력 함수를 호출할 때, C언어와 같이 인자(Argument)로 입력받을 변수의 주소값을 넣어줘야 합니다. (Go의 경우 배열의 경우에도 동일합니다)
이때 &(ampersand) - 앰퍼샌드를 사용하게 되는데, 왜 출력 함수와는 달리 입력 함수에는 주소값이 사용되어야만 할까요?

출력 함수의 경우 전달받은 값을 단순히 출력만 하기 때문에 주소값을 전달해줄 필요가 없습니다. scanf()함수는 함수 내부에서 전달받은 값을 수정합니다. 함수의 외부에서 다른 함수의 변수를 수정할 수 있는 방법이 메모리 주소를 통한 접근만 가능하기 때문입니다. call by value vs call by reference의 차이점을 통해 알 수 있었습니다.


변수

네이밍

  • 숫자로 시작 지양
  • 네이밍에 공백 사용 불가
  • 대/소문자 구분
    • 대문자 → 전역변수
    • 소문자 → 지역변수

선언 방법

  • var
    • 일반적인 형태
      var i int // 선언
      var j int = 10 // 선언 및 초기화
    • 타입 생략
      var i = 10 // 타입 추론
      var j = "name"
      • 예시

        package main
        
        import (
        	"fmt"
        	"reflect"
        )
        
        func main() {
        	var i = 10
        	var j = "donggyu"
        
        	fmt.Println(i)
        	fmt.Println("Type : ", reflect.TypeOf(i))
        	fmt.Println(j)
        	fmt.Println("Type : ", reflect.TypeOf(j))
        }
  • 선언 및 초기화
    i := 10 // var i int = 10
  • 상수
    • 선언과 동시에 값을 할당 해줘야한다.

      const i string = "name"

함수

함수 정의 및 호출

  • func 키워드 사용
    • 매개변수가 있는 함수
      func TestFunction(i int){
      	//...
      }
    • 매개변수가 없는 함수
      func TestFunction(){
      	//...
      }
    • 반환값이 있는 함수
      func TestFunction()(x int){
      	//...
      	return x
      }
    • 반환값이 없는 함수
      func TestFunction(int i){
      	//...
      }

다중 반환값(Multiple Return)

2개 이상의 반환값을 동시에 반환할 수 있다.

func TestFunction()(i int, j int){
	//...
	return i,j
}
	

공백 식별자 “_”

사용할 필요가 없는 변수는 “_” 기호로 사용하지 않음을 표시

  • 사용하지 않는 변수를 선언하는 것은 에러, 컴파일 속도 저하 등의 문제 발생
func TestFunction()(i int, j int){
	//...
	return i,j
}
	
a, _ := TestFunction()

Defer - 지연함수

defer 키워드를 통해 함수를 나중에 실행할 수 있음

  • main 함수가 끝나기 전에 defer로 설정한 함수가 실행된다.
  • 주로 리소스 반환, 열린 파일 닫기, Mutex 잠금 해제 등에 쓰인다.
  • LIFO(Last-In First-Out) 형태로 실행된다.
    package main
    
    import (
    	"fmt"
    )
    
    func stack() {
    	for i := 1; i <= 10; i++ {
    		defer fmt.Println(i)
    	}
    }
    
    func main() {
    	stack()
    }

가변 함수 - “…” 사용

매개변수가 동적으로 변할 때 사용

package main

import "fmt"

func sum(n ...int) int {
	total := 0
	for _, value := range n {
		total += value
	}
	return total
}

func main() {

	result := sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

	fmt.Println("result : ", result)
}
profile
좋은 개발자가 되고싶은

0개의 댓글