이번 편의 목표: 하루 요율을 정하는 함수를 값으로 넘겨, 연체 일수 목록의 합계를 구합니다.

함수도 값입니다. 매개변수의 타입이 func(int) int이면, 그 모양의 함수를 넘길 수 있습니다. 이름 없이 그 자리에 만드는 함수를 함수 리터럴이라고 합니다.

Go
package main

import "fmt"

func totalFee(days []int, rate func(int) int) int {
	total := 0
	for _, day := range days {
		total += rate(day)
	}
	return total
}

func main() {
	days := []int{0, 2, 4}
	paper := func(day int) int {
		if day <= 0 {
			return 0
		}
		return day * 100
	}
	fmt.Println(totalFee(days, paper))
}

0은 0원이고 2와 4는 200원과 400원입니다. 출력은 600입니다. totalFee는 하루가 100원인지 50원인지 모릅니다. 넘긴 rate가 그 결정을 합니다. 전자책 요율이 필요하면 50을 곱하는 함수를 따로 만들어 같은 totalFee에 넘깁니다.

직접 해 보기

목록을 1, 0, 5로 바꿔 합계가 600인지 확인하세요.

해설

1과 5만 요금이 있습니다. 100과 500의 합은 600입니다. 0을 0원으로 두는 함수는 그대로 둡니다.