『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 7강 함수

2021. 5. 22. 00:34개발/Golang

728x90
반응형

자주 사용되는 코드를 묶어서 함수로 만들수 있습니다. 그러면 같은 기능을 매번 다시 만들 필요없이 재사용이 가능합니다. 이번엔 함수를 요약해보도록 하겠습니다.

 

1. 함수의 정의

 

func Add(a int, b int) int {
	return a + b  
}

 

  • func : 함수정의 키워드
  • Add : 함수 name
  • ( a int, b int ) : 매개변수
  • int : 반환 타입

 ★ Go언어에서는 함수코드 블록의 시작을 알리는 중괄호 { 가 함수를 정의 하는 라인고 항상 같은 줄에 있어야 합니다. 

 

package main

import "fmt"

func Add(a int, b int) int {
	return a+b
}

func main() {
	c := Add(3,6)
    fmt.Println(c)
    }

Add() 함수를 정의하고, 두 정수 a와 b를 입력 받아서 그 둘의 합을 반환합니다. 그리고 반환값을 c에 저장합니다. 그리고 c를 출력하면 9라는 숫자가 나오게 됩니다.

 

2. 함수를 쓰는 이유

- 반복 사용되는 코드를 묶을 수 있음

- 함수를 이용해서 중복코드를 제거하여 코드를 간결하게 만들 수 있음

 

package main

import "fmt"

func PrintAvgScore( name string, math int, eng int, history int) {
	total := math + eng + history
    avg := total / 3
    fmt.Println(name,"님 평균 점수는", avg,"입니다.")
    }
    
func main() {
	PrintAvgScore("김일등",80,74,95)
    PrintAvgScore("송이등",88,92,53)
    PrintAvgScore("박삼등",78,73,78)
    }

결과값

  • 함수를 정의하지 않으면 김일등, 송이등, 박삼등의 math와 eng와 history를 다 하나씩 변수를 잡아줘야하지만 PrintAvgScore()의 함수를 통해 이름과 점수등을 입력받아 호출하여 처리할수 있습니다.

★ 자주 사용되거나 변경 가능성이 있는 코드 블록을 묶어서 함수를 만들면 효율적으로 코딩할 수 있으며 추후 프로그램 변경 요구에도 간단히 대처할 수 있습니다. 그리고 코드를 묶어서 이름을 부여하기에 코드를 읽기에도 훨씬 편해집니다.

 

3. 멀티반환함수

함수는 값을 여러개 반환이 가능합니다. 여럿일때는 소괄호로 () 묶어서 표헌합니다.

 

package main

import "fmt"

func Divide (a,b int) (int, bool){	// a와 b는 둘다 int기에 한번만씀, 반환값은 int와 bool로 () 묶음
	if b == 0 {
    	return 0, false
	}
    return a/b , true
    }
    
    func main() {
    c, success := Divide(9,3)
    fmt.Println(c, success)
    d, success := Divide(9,0)
    fmt.Println(d, success)
    }

결과값

  • Divide() 함수를 정의하고 매개변수 a,b는 같은 int값이기에 ( a,b int )로 정의가 가능합니다
  • c와 success는 Divide(9,3)의 값이 출력되는데  c는 3이고 success는 true가 대입됩니다.
  • d와 success는 Divide(9,0)의 값이 출력되는데  c는 0이고 success는 false가 대입됩니다.

 

4. 변수명을 지정해서 반환하기

package main

import "fmt"
 
func Divide (a , b int) (result int, success bool) {	// 반환할 변수명을 명시 함
	if b == 0{
    result = 0
    success = false
    return // 명시적으로 반환할 값을 지정하지 않은 return 문
    }
    result = a / b
    success = true
    return
}

func main() {
    c, success := Divide(9,3)
    fmt.Println(c, success)
    d, success := Divide(9,0)
    fmt.Println(d, success)
}

결과값

  • Divide의 함수에 첫번째 반환할 변수는 result이고, 두번째 success를 지정했습니다. 이렇게 지정한 두 변수는 Divide 함수 내에서 변수로 동작합니다.
  • 함수 결과를 반환할 때 명시적으로 result,success를 지정하지 않았지만 두 값이 반환됩니다.

 

5. 재귀 호출

함수 안에서 자기 자신 함수를 다시 호출 하는것을 재귀 호출이라고 합니다.

재귀 호출 시에는 항상 탈출 조건이 명확해야합니다.

package main

import "fmt"

func printNo(n int) {
	if n == 0 {		// 재귀호출 탈출조건
    return
    }
	fmt.Println(n)
    printNo(n-1)	// 재귀호출
    fmt.Println("After",n)	//재귀호출후 출력
}

func main() {
	printNo(3)
    }

결과값

  • 호출 순서를 보면 printNo(3)이 먼저 호출되고 그다음 printNo(2), printNo(1),printNo(0) 순으로 호출됩니다. 최종적으로 printNo(0) 이 됬을때 if == 0이 만족해 return이 되어 종료가 됩니다.
  • 재귀호출된 printno(n-1)의 함수가 종료되면 호출자인 fmt.Println() 위치로 반환되고 거기에서 명령을 수행해 "After" 메세지가 출력이 됩니다. 

    ※ 재귀호출시 탈출조건이 명확하지 않으면 무한히 반복되어 프로그램이 비정상 종료가 됩니다.

728x90
반응형