함수라는 것은 인풋 파라메터를 아웃풋 파라메터로 매핑시키는 독립된 코드를 말한다. 함수 (또는 프로시져나 서브루틴으로 알려져있기도 하다)는 종종 블랙박스에 비유되기도 한다. 지금까지 살펴봤던 프로그램에는 오직 하나의 함수만 포함되어 있었다.
1  | func main() {}  | cs | 
이제 다수의 함수를 포함한 프로그램을 만들어보자.
Your Second Function
앞서 살펴봤던 프로그램을 다시 살펴보자.
1 2 3 4 5 6 7 8 9 10 11 12  | package main import "fmt" func main() {   xs := []float64{98,93,77,82,83}   total := 0.0   for _, v := range xs {     total += v   }   fmt.Println(total / float64(len(xs))) }  | cs | 
이미 살펴본 바와 같이 이 프로그램은 평균값을 계산한다. 평균값 계산 같은 경우는 아주 일반적인 문제로, 함수를 정의하는데 아주 적합하다.
평균 함수는 다수의 float64 값을 받아서 하나의 float64 값으로 반환해준다. main 함수 앞에 다음의 내용을 넣어보자.
1 2 3  | func average(xs []float64) float64 {   panic("Not Implemented") }  | cs | 
1 2 3 4 5 6 7 8 9 10 11  | package main import "fmt" func average(xs []float64) float64 {   total := 0.0   for _, v := range xs {     total += v   }   return total / float64(len(xs)) }  | cs | 
fmt.Println 를 return 으로 변경했음에 주목하자. return 문은 함수로 하여금 즉각 중지하고 값을 반환하도록 한다. 다음과 같이 main 을 수정해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  | package main import "fmt" func average(xs []float64) float64 {   total := 0.0   for _, v := range xs {     total += v   }   return total / float64(len(xs)) } func main() {   xs := []float64{98,93,77,82,83}   fmt.Println(average(xs)) }  | cs | 
위의 프로그램을 실행해보면 마찬가지의 결과를 얻을 수 있을 것이다.
그리고 파라메터 이름은 호출함수의 것과 일치할 필요는 없다. 다음과 같이 작성해도 여전히 작동한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  | package main import "fmt" func average(xs []float64) float64 {   total := 0.0   for _, v := range xs {     total += v   }   return total / float64(len(xs)) } func main() {   alphago := []float64{98,93,77,82,83}   fmt.Println(average(alphago)) }  | cs | 
함수는 호출 함수에 대한 접근 권한이 없다. 아래는 작동하지 않는다.
1 2 3 4 5 6 7 8 9 10 11 12  | package main import "fmt" func f() {   fmt.Println(x) } func main() {   x := 5   f() }  | cs | 
1 2 3 4  | :~/go/src/golang-book/chapter7# go run main.go # command-line-arguments ./main.go:6:15: undefined: x  | cs | 
다음과 같이 수정해야 한다.
1 2 3 4 5 6 7 8 9 10 11 12  | package main import "fmt" func f(x int) {   fmt.Println(x) } func main() {   x := 5   f(x) }  | cs | 
또는
1 2 3 4 5 6 7 8 9 10 11 12 13  | package main import "fmt" var x int = 5 func f() {   fmt.Println(x) } func main() {   f() }  | cs | 
1 2 3  | :~/go/src/golang-book/chapter7# go run main.go 5  | cs | 
함수는 차곡차곡 쌓아올릴 수 있다. 다음과 같은 프로그램을 생각해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  | package main import "fmt" func main() {     fmt.Println(f1()) } func f1() int {     return f2() } func f2() int {     return 1 }  | cs | 
다음 그림과 같이 생각하면 된다.

함수를 호출할 때마다, 그것을 call stack 에 올려두는 것이고, 빠져나올 때마다 마지막 함수를 끄집어 내리는 셈이다.
반환형을 다음과 같이 명명할 수도 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  | package main import "fmt" func main() {     fmt.Println(f1()) } func f1() int {     return f2() } func f2() (r int) {   r = 1   return }  | cs | 
'Season 1 아카이브 > 프로그래밍' 카테고리의 다른 글
| SQLTools connect - cannot save "connections.xml" error (0) | 2018.09.17 | 
|---|---|
| Go 언어 입문 - Control Structures - Functions (2) (golang-book) (0) | 2018.09.09 | 
| Go 언어 입문 - Control Structures - Maps (golang-book) (0) | 2018.09.05 | 
| Go 언어 입문 - Control Structures - Slice (golang-book) (1) | 2018.09.04 | 
| Go 언어 입문 - Control Structures - Array (golang-book) (0) | 2018.09.01 |