Golang 스터디(with 큐시즘 개발팀) - 3주차

PM/iOS Developer KimKU·2022년 9월 26일
0

Go Study

목록 보기
3/4
post-thumbnail

Go Study

1. 함수 정의

함수는 함수 키워드, 함수명, 매개변수, 변환 타입, 함수 코드 블록으로 구성된다.

func Add(a int, b int) int{
			//a 와 b를 더한 결과를 반환한다.
			return a + b
}

func 키워드를 사용해서 함수 정의를 알린다. 그 뒤에 함수명(Add)이 온다. 함수명의 명명 규칙은 변수명과 같다. 첫 글자가 대문자인 함수는 패키지 외부로 공개되는 함수이다.

소괄호(a int, b int) 안에 매개변수를 넣는다. 매개변수는 함수 코드 수행 시 필요한 입력값이다. 만약 매개변수가 필요하지 않으면 비워둔다. 반환타입(int)이 온다. 반환하는 값이 있으면 적고, 아니면 비워둔다. 중괄호로 함수 코드 블록을 표시한다. Go 언어에는 함수 코드 블록의 시작을 알리는 중괄호 { 가 함수를 정의하는 라인과 항상 같은 줄에 있어야 한다.

정수 타입 매개변수 2개를 입력으로 받아서 그 합을 반환하는 함수를 구현해보자.

package main

import "fmt"

func Add(a int, b int) int { //1
		return a + b             //2
}
func main(){
		c := Add(3, 6)  //3
		fmt.Println(c)  //4
}
  1. Add() 함수를 정의한다. 두 정수 타입 매개변수 a 와 b의 입력을 받는다.
  2. 입력받은 a 와 b의 합을 반환한다.
  3. Add() 함수를 호출한다. 반환값을 c에 저장한다.
  4. c를 출력한다.

2. 함수 사용

평균 점수를 출력하는 함수를 Golang으로 만든 예제다.

package main

import "fmt"

func PrintAvgScore(name string, math int, eng int, history int){
	total := math + eng + history
	avg := total / 3
	fmt.Println(name, "님 평균 점수는", avg, "입니다.")
}

func main(){
	PrintAvgScore("김일등", 80, 74, 95)
	PrintAvgScore("송이등", 88, 92, 53)
	PrintAvgScore("박삼등", 78, 73, 78)
}

변수 적는 방법은 아직도 적응이 안된다…

package main

import "fmt"

func Divide(a, b int)(int, bool){ //1 함수 선언
	if b == 0{ 
		return 0, false               //2 제수가 0일 때 반환
	}
	return a / b, true              //3 제수가 0이 아닐 때 반환
}

func main(){
	c, success := Divide(9, 3) //4 제수가 0이 아닌 경우
	fmt.Println(c, success)
	d, scuuess := Divide(9, 0) //5 제수가 0인 경우
	fmt.Println(d, success)
}
  1. Divide() 함수를 정의한다. 이 함수는 int 타입 a, b를 매개변수로 받고 int 타입과 bool 타입을 반환한다.(엥…?) (a int, b int) 같이 매개변수 타입이 같으면 간단히 (a, b, int)처럼 표현할 수 있다.
  2. 나눗셈 제수가 0이면 0과 false를 반환한다. 3번에서 제수가 0이 아닐 때는 나눗셈 결과와 true를 반환한다. 4, 5번에서 Divide() 함수를 호출하고, 그 결과를 변수 c와 success로 받는다. 첫 번째 반환값은 c에, 두 번째 반환값은 success에 대입된다.

Divide() 함수를 호출한 결괏값이 c와 success에 대입되는 과정은 다음과 같다.

c, success := Divide(9, 3) //함수 호출

c, success := 3, true //함수 호출 후 반환값이 3, true
                      //3은 c에, true는 success에 대입

위의 코드를 이해하는데 시간이 좀 걸렸다. (int, bool)이 왜 저기에 쓰이는지, 그리고 출력값이 왜 저렇게 나오는지 처음엔 이해가 잘 안되서 코드를 긴 시간동안 봤다. 좀 더 직관적인 코드로도 바꿀 수 있는것 같다.

package main

import "fmt"

func Divide(a, b int) (result int, success bool) { //반환할 변수명 명시
	if b == 0 {
		result = 0
		succsee = false
		return 
	}
	result = a / b
	success = true
	return 
}

func main() {
	c, success := Divide(9, 3)
	fmt.Println(c, success)
	d, success := Divide(9, 0)
	fmt.Println(d, success)
}

함수 선언부에서 첫 번째로 반환할 변수로 result를, 두 번째는 success를 지정했다. 이렇게 지정한 result, success는 함수 내부에서 변수로 동작한다. 함수 결과를 반환할 때 명시적으로 result, success를 지정하지 않았지만 두 값이 반환된다.

재귀 호출에 대해서도 알아보려고 한다. 재귀 호출이란 함수 안에서 자기 자신 함수를 다시 호출하는 것을 말한다.

package main

import "fmt"

func printNo(n int){ //1
	if n == 0{
		return
	}
	fmt.Println(n)
	printNo(n-1) //2
	fmt.Println("After", n) //3
}

func main(){
	printNo(3) //4
}

4번에서 printNo() 함수를 호출한다, 그리고 1번에서 탈출 조건인지 확인한다. n이 0이 아니면 2번 문장의 printNo() 함수를 다시 호출한다.

이렇게 함수 안에서 같은 함수를 다시 호출하는 것을 재귀 호출이라고 한다. 호출 순서를 보면 printNo(3)이 먼저 호출되고 이어서 printNo(2), printNo(1), printNo(0) 순으로 호출된다. 최종적으로 printNo(0)이 호출됐을 때 1번 코드에서 탈출 조건인 n == 0을 만족해 return 되어 종료된다.

profile
With passion and honesty

0개의 댓글