Programming language/Golang

[Go] 07 함수

chaenii 2022. 1. 11. 22:21

본 게시물은 Tucker의 Go언어 프로그래밍을 참고해 작성한 게시물입니다.

http://www.yes24.com/Product/Goods/99108736

 

Tucker의 Go 언어 프로그래밍 - YES24

게임 회사 서버 전문가가 알려주는 Go 언어를 내 것으로 만드는 비법구글이 개발한 Go는 고성능 비동기 프로그래밍에 유용한 언어이다. 『Tucker의 Go 언어 프로그래밍』은 Go 언어로 ‘나만의 프로

www.yes24.com

 

함수를 호출하면 생기는 일

 

인자 (argument) : 함수 호출할 때 입력하는 값

매개변수(parameter): 함수가 외부로부터 받는 변수

 

함수를 호출하며 입력한 값을 실제 함수에 그대로 사용하는 것이 아니라 값을 복사해서 사용하게 된다.

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

func main() {

	c := Add(3, 6)
	fmt.Println(c)

}

1. 3과 6을 a와 b에 복사한다.

2. 반환값을 c에 전달 한다.

3. 함수가 종료되면 함수에서 사용한 지역변수에 접근 불가하다.

4. 함수 결과가 반환되면서 함수가 즉시 종료되어 함수를 호출했던 호출 위치로 명령 포인터가 되돌아가서 수행된다.

 

⚠️ 인수는 매개변수로 복사된다. 매개변수가 함수 내에서 선언된 변수는 함수가 종료되면 변수 범위를 벗어나서 접근하지 못한다.

 

함수를 쓰는 이유

함수를 사용하면 반복 사용되는 코드를 묶을 수 있다.

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

 

멀티 반환 함수

함수는 값을 여러개 반환할 수 있다. 

func Divide(a, b int) (int, bool) {
	if b == 0 {
		return 0, false
	}
	return a / b, true
}

func main() {
	c, success := Divide(3, 1)
	fmt.Println(c, success) // 3, true
	c, success = Divide(2, 0)
	fmt.Println(c, success) // 0, false
}

 

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

함수 선언부에 반환 타입을 적을 떄 변수명까지 지정해주면 함수 결과를 반환할 때 명시적으로 반환할 값을 지정하지 않아도 된다.

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(3, 1)
	fmt.Println(c, success) // 3, true
	c, success = Divide(2, 0)
	fmt.Println(c, success) // 0, false
}

 

 

재귀 호출

재귀 호출이란 함수안에서 자기 자신 함수를 다시 호출하는 것을 말한다.

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

func main() {
	printNo(3) // 함수 호출
}
더보기

3
2
1
After 1
After 2
After 3

⚠️ 재귀 호출을 사용할 때는 항상 탈출 조건을 정해야한다. 재귀 호출이 종료되는 시점을 명확히하지 않으면 재귀 호출이 무한히 반복되어 프로그램이 비정상종료된다.

반응형

'Programming language > Golang' 카테고리의 다른 글

[Go] 11 for문  (0) 2022.01.15
[Go] 10 switch  (0) 2022.01.12
[Go] 09 조건문  (0) 2022.01.12
[Go] 08 상수  (0) 2022.01.11
[Go] 06 연산자  (0) 2022.01.10