코딩/GoLang

GoLang의 Higher Order Function

드리프트 2021. 1. 28. 21:38
728x170

 

 

안녕하세요?

 

GoLang의 고차함수(Higher Order Function)에 대해 간단히 알아 보겠습니다.

 

먼저, 고차 함수는 함수를 인수로 받거나 함수를 반환하는 함수입니다.

즉, 인수로 취하거나 또는 반환되어 다른 함수에서 작동하는 함수를 고차함수라고 부릅니다.

 

예제를 들어 보겠습니다.

package main

import "fmt"

func sum(x, y int) int {
	return x + y
}

// 고차함수
// partialSum 함수는 x 라는 int 타입을 인수로 받고
// 리턴하는 것은 바로 func(int) int 라는 함수를 리턴합니다.
func partialSum(x int) func(int) int {

	// partialSum 함수가 리턴하는게 func(int) int 니까
	// 바로 아래에서 return func(y int) int 라고 했습니다.
	return func(y int) int {

		// 근데 이건 또 아래와 같이 sum 함수를 리턴합니다.
		// sum 함수에 인자로 넘겨지는 변수는 x는 계속해서 넘어가게 됩니다.
		return sum(x, y)
	}
}
func main() {
	// 아래 코드의 partialSum(3)은 partialSum 코드의 x 에 해당되고
	// 리턴되는 건 return func(y int) int 입니다.
	// 그래서 partial 이라는 새로운 함수 변수는
	// func(y int) int 타입의 함수가 되는 겁니다.
	partial := partialSum(3)

	// 여기서 partial(7)이라고 호출했는데
	// 7이 바로 partialSum 함수의 y가 되는 겁니다.
	fmt.Println(partial(7))

	// 위 두 코드는 아래와 같이 한줄로 쓸 수 있습니다.
	// partialSum(3) 바로 뒤에 또 (7)를 붙혀 씁니다.
	// 함수이름 뒤에 ()를 쓴다는 거는 함수를 실행하라는 뜻입니다.
	// 그래서 3을 인자로 함수 실행 하고
	// 그래서 리던된 함수에 다시 7을 인자로 넣고 그 함수를 실행하라는 뜻입니다.
	fmt.Println(partialSum(3)(7))
}

 

실행결과는 당연히 "10"입니다.

 

좀더 어려운 예제를 보겠습니다.

 

기본 원리는 같습니다.

package main

import "fmt"

func squareSum(x int) func(int) func(int) int {
	return func(y int) func(int) int {
		return func(z int) int {
			return x*x + y*y + z*z
		}
	}
}
func main() {
	// 5*5 + 6*6 + 7*7
	fmt.Println(squareSum(5)(6)(7))
}

 

그리드형

'코딩 > GoLang' 카테고리의 다른 글

GoLang 클로저 함수  (0) 2021.01.28
GoLang 익명 함수(Anonymous Function)  (0) 2021.01.28
GoLang에서 Map Iterate, add, update 하기  (0) 2021.01.28
GoLang에서 URL 파싱하기  (0) 2021.01.26
Go 언어, GoLang 강좌 튜토리얼 소개  (1) 2021.01.26