🔥 함수 값

482자
6분

함수는 다른 값들과 마찬가지로 값으로 취급되어진답니다. 함수를 다른 값들처럼 전달할 수 있어요.

함수 값은 함수의 인자나 반환 값으로 사용될 수 있죠.

package main
 
import (
    "fmt"
    "math"
)
 
func compute(fn func(float64, float64) float64) float64 {
    return fn(3, 4)  // 전달받은 함수 fn을 호출하면서 3과 4를 인자로 전달하죠.
}
 
func main() {
    // hypot 함수 변수를 선언하고, 익명 함수를 할당하네요.
    hypot := func(x, y float64) float64 {
        return math.Sqrt(x*x + y*y)  // x와 y의 제곱의 합에 제곱근을 구해 반환해요.
    }
    fmt.Println(hypot(5, 12))  // hypot 함수를 직접 호출하면서 5와 12를 인자로 전달하죠.
 
    fmt.Println(compute(hypot))    // compute 함수를 호출하면서 hypot 함수를 인자로 전달해요.
    fmt.Println(compute(math.Pow)) // compute 함수를 호출하면서 math.Pow 함수를 인자로 전달하네요.
}
 
go

위 코드에서 compute 함수는 함수를 인자로 받아 그 함수를 호출한 결과를 반환하는 함수랍니다. compute 함수의 인자로 전달되는 함수는 float64 타입의 매개변수 두 개를 받아 float64 타입의 값을 반환하는 함수예요.

main 함수에서는 hypot이라는 함수 변수를 선언하고 익명 함수를 할당했어요. 이 익명 함수는 두 개의 float64 타입 매개변수를 받아 그 제곱의 합에 제곱근을 구해 반환하는 함수죠.

그리고 hypot 함수를 직접 호출하여 결과를 출력하고, compute 함수를 호출하면서 hypot 함수와 math.Pow 함수를 인자로 전달하여 결과를 출력하고 있어요.

이처럼 함수는 값으로 취급되어 다른 함수의 인자나 반환 값으로 사용될 수 있답니다. 이를 통해 함수를 매개변수로 전달하여 다양한 동작을 수행하는 함수를 만들 수 있게 되죠.

함수 값을 활용하면 코드의 재사용성과 유연성을 높일 수 있어요. 함수를 값으로 다룰 수 있다는 것은 Go 언어의 강력한 특징 중 하나랍니다!

그런데 위 코드에서 func(float64, float64) float64와 같이 함수 타입을 반복해서 사용하고 있죠? Go 언어에서는 타입 별칭(type alias)을 사용하여 함수 타입에 별칭을 지정할 수 있어요. 이를 통해 함수 타입을 더 간결하고 가독성 있게 표현할 수 있답니다.

package main
 
import (
    "fmt"
    "math"
)
 
// BinaryOperation 타입 별칭을 선언하여 func(float64, float64) float64 함수 타입을 간결하게 표현해요.
type BinaryOperation func(float64, float64) float64
 
func compute(fn BinaryOperation) float64 {
    return fn(3, 4)  // 전달받은 함수 fn을 호출하면서 3과 4를 인자로 전달하죠.
}
 
func main() {
    // hypot 함수 변수를 선언하고, 익명 함수를 할당하네요.
    hypot := func(x, y float64) float64 {
        return math.Sqrt(x*x + y*y)  // x와 y의 제곱의 합에 제곱근을 구해 반환해요.
    }
    fmt.Println(hypot(5, 12))  // hypot 함수를 직접 호출하면서 5와 12를 인자로 전달하죠.
 
    fmt.Println(compute(hypot))    // compute 함수를 호출하면서 hypot 함수를 인자로 전달해요.
    fmt.Println(compute(math.Pow)) // compute 함수를 호출하면서 math.Pow 함수를 인자로 전달하네요.
}
 
go

위 코드에서는 BinaryOperation이라는 타입 별칭을 선언하여 func(float64, float64) float64 함수 타입을 간결하게 표현했어요. 이제 BinaryOperation 타입을 사용하여 함수 타입을 더 읽기 쉽게 나타낼 수 있죠.

compute 함수의 매개변수 타입으로 BinaryOperation을 사용하고 있네요. 이를 통해 compute 함수가 어떤 타입의 함수를 인자로 받는지 명확하게 표현할 수 있답니다.

타입 별칭을 사용하면 함수 타입을 간결하게 표현할 수 있을 뿐만 아니라, 코드의 가독성과 유지보수성도 향상시킬 수 있어요. 특히 함수 타입이 여러 곳에서 사용되는 경우, 타입 별칭을 사용하면 코드의 일관성을 유지하면서도 타이핑의 양을 줄일 수 있죠.

함수 값과 타입 별칭을 함께 활용하면 코드의 재사용성과 유연성을 높이면서도 가독성을 향상시킬 수 있어요. Go 언어에서는 함수를 값으로 다룰 수 있고, 함수 타입에 별칭을 지정할 수 있다는 것이 큰 장점이랍니다!