함수 선언 형식
func Add(a int, b int) int {
return a + b
}
- 함수 키워드 : func
- 함수명 : Add
- 매개변수 : (a int, b int)
- 반환타입 : int
- 함수 코드 블록 : { return a + b }
함수를 호출할 때 생기는 일
함수를 호출할 때 입력하는 값을 Argument라고 한다.
- 인수 혹은 아규먼트라고 한다.
반면 함수가 외부로부터 입력받는 변수를 Parameter라고 한다.
- 매개변수 혹은 파라미터라고 한다.
함수를 호출하여 입력한 값은 실제 함수에 어떻게 전달이 될까? 보낸 값을 그대로 사용하는것이 아니라.. 값을 복사하여 사용하게 된다.
⇒ 인수는 매개변수로 복사된다. 매개변수와 함수 내에서 선언된 변수는 함수가 종료되면 변수 범위를 벗어나서 접근하지 못한다.
다른 언어는 값 전달과 레퍼런스 전달, 두 가지를 지원하지만 Go 언어는 값전달만 지원한다.
Go를 심플하고 일관적인 언어라고 말하는 이유 중 변수 전달이 항상 복사로만 이루어지기 때문도 있다.
그래서 함수 왜씀?
반복 사용되는 코드를 묶을 수 있음.
- 함수를 이용하여 중복 코드를 제거하고 코드를 간결하게 만들 수 있다.
수학, 영어, 역사 시험 성적의 평균을 출력하는 예제가 있다.
package main
import "fmt"
func main() {
math := 80
eng := 74
history := 95 // ❶
fmt.Println("김일등 님 평균 점수는", (math+eng+history)/3, "입니다.") // ❷
math = 88
eng = 92
history = 53
fmt.Println("송이등 님 평균 점수는", (math+eng+history)/3, "입니다.")
math = 78
eng = 73
history = 78
fmt.Println("박삼등 님 평균 점수는", (math+eng+history)/3, "입니다.")
}
점수를 출력하는 코드가 3번 반복되었다.
함수를 사용하여 코드 중복을 아래처럼 줄여보자.
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)
}
printAvgScore() 함수를 사용하여 처리하게 변경하였다.
이렇듯 자주 사용되거나 변경 가능성이 있는 코드 블록을 묶어서 함수를 만들면 효율적으로 코딩을 할 수 있다.
멀티 반환 함수
함수는 값을 여러 개 반환할 수 있다.
- 반환값이 여럿일 때는 반환 타입들을 소괄호로 묶어서 표현한다.
package main
import "fmt"
func Divide(a, b int) (int, bool) { // ❶ 함수 선언
if b == 0 {
return 0, false // ❷ 제수가 0일 때 반환
}
return a / b, true // ❸ 제수가 0이 아닐 때 반환
}
func main() {
c, success := Divide(9, 3) // ➍ 제수가 0이 아닌 경우
fmt.Println(c, success)
d, success := Divide(9, 0) // ➎ 제수가 0인 경우
fmt.Println(d, success)
}
- Divide() 함수를 정의한다.
- int 타입과 bool 타입을 반환한다.
- (a int, b int) 와 같이 매개변수의 타입이 같다면 (a, b int)처럼 표현할 수 있다.
- 나눗셈 제수가 0이면 0과 false를 반환한다.
- 제수가 0이 아닐때는 나눗셈 결과와 true를 반환한다.
변수명을 지정하여 반환하기
함수 선언부에 반환 타입을 적을 때 변수명 까지 지정해주면 return 문으로 해당 변수를 명시적으로 반환하지 않아도 값을 반환할 수 있다.
package main
import "fmt"
func Divide(a, b int) (result int, success bool) { // ❶ 반환할 변수명이 명시된 함수 선언부
if b == 0 {
result = 0
success = false
return // ❷ 명시적으로 반환할 값을 지정하지 않은 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)
}
반환할 변수에 이름을 지정할 경우 모든 반환 변수에 이름을 지정해야 한다.
(모두 지정하거나 모두 지정하지 않거나)
재귀 호출
재귀 호출(recursive call)이란 함수 안에서 자기 자신의 함수를 다시 호출하는 것을 말한다.
3부터 1까지 재귀 호출을 이용하여 출력하는 예제를 살펴보자
package main
import "fmt"
func printNo(n int) {
if n == 0 { // ❶ 재귀 호출 탈출 조건
return
}
fmt.Println(n)
printNo(n - 1) // ❷ 재귀 호출
fmt.Println("After", n) // ❸ 재귀 호출 이후 출력
}
func main() {
printNo(3) // ❹ 함수 호출
}
'Programming > Go' 카테고리의 다른 글
[Golang] if문 (0) | 2022.11.06 |
---|---|
[Golang] 상수 (Const) (0) | 2022.10.29 |
[Golang] 연산자 (Operator) (0) | 2022.10.29 |
[Golang] 표준 입출력 (0) | 2022.10.23 |
[Golang] 변수 (0) | 2022.10.22 |