Golang 정리(4)-익명함수, 고차함수, 일급함수

강다빈·2026년 7월 11일

golang 공부

목록 보기
5/11

1. 익명함수(Anonymous Function)

익명함수는 단어 뜻 그대로 이름을 적지 않고 정의한 함수를 의미함.
일회성으로 사용하거나 특정 로직을 변수에 담아두고 싶을 때 사용

// 일반적인 함수 선언 (이름 있음)
func sum(x int, y int) int { return x + y }

// 익명 함수 선언 (이름 없음)
func(x int, y int) int { return x + y }

2. 고차함수(Higher-Order Function)

고차함수는 함수 자체를 일반 데이터처럼 주고받는 함수를 의미함.
아래 두가지 조건 중 하나라도 만족하면 고차함수라고 부름.

  • 하나 이상의 함수를 파라미터로 받는 함수
  • 함수를 결과로 반환하는 함수
func calc(f func(int, int) int, a int, b int) int {
    result := f(a, b) // 파라미터인 함수 f를 내부에서 실행
    return result
}

3. 일급함수(First-Class Function) -> 언어의 특성

일급함수는 프로그래밍 언어의 특성이나 규칙을 의미함.
일급함수란 어떤 데이터(함수)가 정수나 문자열 같은 기본 데이터 타입과 완벽하게 동일한 대우를 받는 특성을 의미함.(이때 어떤 데이터는 일급객체라고 함)

일급함수 특성을 가진 언어는 함수를 다음과 같이 다룰 수 있음.

  • 변수에 함수를 할당할 수 있음
  • 다른 함수에 함수를 파라미터로 전달할 수 있음
  • 다른 함수의 반환값으로 함수를 사용할 수 있음

즉, 위의 고차함수는 일급함수 특성을 보여줌.

4. 일급함수 특성을 보여주는 익명함수와 고차함수의 예시 코드

package main

import (
    "fmt"
    "strings"
)

func changeValue(message *string) {
    *message = fmt.Sprintf("your name is %s", *message)
}

func addTen(value int) int {
    return value + 10
}

// ... 은 slice 로 값을 받음
func sum(values ...int) int {
    result := 0
    for _, value := range values {
        result = result + value
    }

    return result
}

func divideStrings(value string) (string, string) {
    values := strings.Split(value, "_")
    return values[0], values[1]
}

// 고차함수 -> 함수를 파라미터로 받으므로써 일급함수 특성을 보여줌
func calc(f func(int, int) int, a int, b int) int {
    result := f(a, b)
    return result
}

func main() {
    // 함수 호출
    fmt.Println(addTen(100))

    // slice 변수 호출
    fmt.Println(sum(1, 2, 3, 4, 5))

    // 다중 변수 반환
    prefix, suffix := divideStrings("Your_Name")
    fmt.Println(prefix, suffix)

    // 포인터 전달
    message := "Ronaldo"
    changeValue(&message)
    fmt.Println(message)

    // 익명 함수 -> 함수를 변수에 할당하므로써 일급함수 특성을 보여줌
    sum := func(x int, y int) int {
        return x + y
    }
    fmt.Println(sum(5, 10))

    
    add := func(i int, j int) int {
        return i + j
    }

    minus := func(i int, j int) int {
        return i - j
    }

    fmt.Println(calc(add, 10, 5))
    fmt.Println(calc(minus, 10, 5))
}

코드 참고: https://wikidocs.net/164464

profile
하루살이

0개의 댓글