[Go] (3) 함수, 익명 함수

HY·2022년 10월 8일
0

go-lang-study

목록 보기
3/3
post-thumbnail

함수

함수는 여러 문장을 묶어서 실행하는 코드 블럭의 단위를 의미한다.

package main
//	func + 함수명 + (파라미터 파라미터 타입) {}
func main() {
    msg := "Hello"
    //	Hello 문자열이 복사되어 say()에 전달된다.
    //	pass by value 
    say(msg)
}
 
// 호출 될 때보다 늦게 선언되어도 괜찮다. 
func say(msg string) {
    println(msg)
}
package main
 
func main() {
    total := sum(1, 7, 3, 5, 9)
    println(total)
}
// 리턴 될 값이 int임을 명시한다. 
func sum(nums ...int) int {
    s := 0
    for _, n := range nums {
        s += n
    }
    //	int 타입 값인 s를 리턴한다. 
    return s
}

Pass By Reference

package main
func main() {
    msg := "Hello"
    //	msg 변수의 주소 표시 (값 복사가 아니고 주소만 전달한다)
    say(&msg)
    println(msg) //변경된 메시지 출력
}

//	*를 붙여 파라미터가 포인터임을 표시한다. 
func say(msg *string) {
	//	msg는 문자열을 갖는 메모리 영역의 주소를 갖게 된다. 
    println(*msg)
    //	*msg를 붙여 msg 주소의 메모리 영역의 데이터를 Changed로 변경한다. 
    // = Deferencing
    *msg = "Changed" //메시지 변경
}

Variadic Function(가변 인자 함수)

동일 타입 불특정 다수의 파라미터를 전달할 때 이를 받아들이는 함수를 가변 인자 함수라고 한다.

package main
func main() {   
    say("This", "is", "a", "book")
    say("Hi")
}
//	msg 스트링은 1개에서 n개까지 전달할 수 있다. 
func say(msg ...string) {
    for _, s := range msg {
        println(s)
    }
}

복수의 값 리턴

package main
 
func main() {
    count, total := sum(1, 7, 3, 5, 9)
    println(count, total)   
}
// int 값 두 개를 리턴하기 위해 뒤에 (int, int)로 명시했다. 
func sum(nums ...int) (int, int) {
    s := 0      // 합계
    count := 0  // 요소 갯수
    for _, n := range nums {
        s += n
        count++
    }
    return count, s
}

Named Return Parameter

// return 될 파라미터 명을 명시해 코드 가독성이 좋아진다. 
func sum(nums ...int) (count int, total int) {
    for _, n := range nums {
        total += n
    }
    count = len(nums)
    // return 되는 값이 있을 경우 리턴 될 파라미터를 따로 명시하지 않아도 return을 넣어야 한다. 
    return
}

익명 함수

함수 명을 갖지 않는 함수를 익명 함수라고 한다. 함수 전체를 변수에 할당하거나 다른 함수의 파라미터에 직접 정의되어 사용될 때 쓰인다.
익명 함수가 변수에 할당된 후에는 변수 명이 함수 명과 같이 취급되어 변수명(파라미터)형식으로 함수를 호출할 수 있다.

package main
 
func main() {
    sum := func(n ...int) int { //익명함수 정의 (이름 생략되어 있음) 
        s := 0
        for _, i := range n {
            s += i
        }
        return s
    }
 
    result := sum(1, 2, 3, 4, 5) // 변수 sum에 할당된 익명함수 호출
    println(result)
}

일급 함수

일급 함수는 어떤 언어에서 함수를 다른 변수와 동일하게 다룰 때 그 언어는 일급 함수를 가졌다고 표현한다. 함수를 다른 함수에 인수로 제공하거나, 함수가 함수를 반환하거나, 변수에 함수를 할당할 수 있다.

package main
 
func main() {
    //변수 add 에 익명함수 할당
    add := func(i int, j int) int {
        return i + j
    }
 
    // add 함수 전달
    r1 := calc(add, 10, 20)
    println(r1)
 
    // 직접 첫번째 파라미터에 익명함수를 정의함
    r2 := calc(func(x int, y int) int { return x - y }, 10, 20)
    println(r2)
 
}
 
func calc(f func(int, int) int, a int, b int) int {
    result := f(a, b)
    return result // 함수 리턴
}

type을 사용한 함수 원형 정의

type은 구조체, 인터페이스 등 custom type을 정의하기 위해 사용된다. 이는 함수 원형을 정의하는데 사용될 수 있다.

// 원형 정의
type calculator func(int, int) int
 
// calculator 원형 사용
func calc(f calculator, a int, b int) int {
    result := f(a, b)
    return result
}

함수 원형을 정의하고 함수를 타 메서드에 전달하고 리턴 받는 기능을 델리게이트라고 부른다.

참고 문헌

http://golang.site/

profile
사실은 공부를 비밀스럽게 하고 싶었다

0개의 댓글