함수는 함수 키워드, 함수명, 매개변수, 변환 타입, 함수 코드 블록으로 구성된다.
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
}
평균 점수를 출력하는 함수를 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)
}
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 되어 종료된다.