[쉽고 빠르게 끝내는 GO언어 프로그래밍 핵심 기초 입문 과정] Section 7 : Go 함수
인프런 쉽고 빠르게 끝내는 GO언어 프로그래밍 핵심 기초 입문 과정 강의 정리
7.1 함수 기초
7.1.1 함수
- 여러 문장을 묶어서 실행하는 코드 블럭 단위
func
키워드를 사용하여 정의한다.- 타 언어와 달리 변환 값
return value
다수 가능
|
|
함수 사용 예제
|
|
-
Result
Example 1 : Hello, GoLang
Example 2 : Hello World!
Example 3 : 10
Example 3 : 10
Example 3 : 10
7.1.2 매개변수 전달
- Go에서 파라미터를 전달하는 방식
- 함수(콜백)전달
- 값 전달
call by value
- 참조 전달
call by reference
로 나뉜다.
|
|
- Result
Example 1 : 110
Example 2 : 100
Example 3 : 1000
7.1.3 함수의 리턴 값
- Go에서는 리턴값은 복수 개도 지원한다.
Multi Return Value 예제
|
|
- Go에서는 리턴되는 값들을 (함수에 정의된) 리턴 파라미터들에 할당할 수 있다.
Named Return Parameter 예제
|
|
7.1.4 가변 인자 함수 Variadic Function
- 함수에 고정된 수의 파라미터를 전달하지 않고 다양한 숫자의 파라미터를 전달하고자 할때 사용
- … 예약어를 사용한다.
|
|
-
Result
x -> 151200
y -> 91
Print Word -> A
Print Word -> F
Print Word -> test
Print Word -> golang
Print Word -> seoul
Slice Parameter -> 151200
Slice Parameter -> 45
함수를 변수에 할당
|
|
- Result
슬라이스에 함수 할당 -> 100 100
슬라이스에 함수 할당 -> 20 20
변수에 함수 할당 -> 100
변수에 함수 할당 -> 20
Map에 함수 할당 100
Map에 함수 할당 20
7.1.5 재귀 함수 Recursion
- 장점 : 프로그램이 보기 쉽고, 코드가 간결, 오류 수정이 용이하다.
- 단점 : 코드를 이해하기 어렵고, 기억공간을 많이 사용, 무한루프 가능성이 있다.
팩토리얼 재귀함수 예제
|
|
-
Result
Example 1 : 5040
Example 2 : ( 10 ) hi!
Example 2 : ( 9 ) hi!
Example 2 : ( 8 ) hi!
Example 2 : ( 7 ) hi!
Example 2 : ( 6 ) hi!
Example 2 : ( 5 ) hi!
Example 2 : ( 4 ) hi!
Example 2 : ( 3 ) hi!
Example 2 : ( 2 ) hi!
Example 2 : ( 1 ) hi!
7.1.6 익명함수 Anonymous Functions
- 선언과 동시에 즉시 실행
|
|
-
Result
Example 1 : Anonymous Function !
Example 2 : Hello GoLang!
Example 3 : 30
Example 4 : 1000
7.2 defer
7.2.1 지연실행 defer
- defer 키워드는 특정 문장 혹은 함수를 나중에 (defer를 호출하는 함수가 리턴하기 직전) 실행한다.
- 일반적으로
C#
,java
같은 언어에서의finally
블럭처럼 마지막에clean-up
작업을 위해 사용된다. - 리소스 반환, 열린 파일 닫기, Mutex 잠금 해제 등 사용
|
|
- Result
f1 : start!
f1 : end!
f2 : called!
익명함수 defer 예제
|
|
- Result
Hi !
GoLang
7.2.2 스택
defer
키워드를 사용하면 함수가 역순으로 실행되는 것을 볼 수 있다.- 자료구조의
stack
과 동일하며, 제일 나중에 지연 호출한 함수가 제일 먼저 힐행된다.후입선출
|
|
-
Result
Example 1 : 10
Example 1 : 9
Example 1 : 8
Example 1 : 7
Example 1 : 6
Example 1 : 5
Example 1 : 4
Example 1 : 3
Example 1 : 2
Example 1 : 1
중첩 함수에 defer 키워드를 사용할 경우 주의 사항
|
|
- Result
start : b
in a
end : b
7.3 Closure
7.3 Closure란
- 익명함수는 함수를 변수에 할당할 수 있다.
- 함수 안에서 함수를 선언 및 정의 가능하며 이 때 외부 함수에 선언된 변수에 접근 가능하다.
- 함수가 선언되는 순간에 함수가 실행 될 때 실체의 외부 변수에 접근하기 위한 스냅샷(객체)이다.
- 함수를 호출 할 때 이전에 존재했던 값을 유지하기 위해 사용한다
- 비동기, 누적카운트, 무분별한 전역변수 남발을 피하기 위해 사용
- 전역변수 남발로 인해 메모리 부족, 오버플로우 현상, 리소스 남용을 방지
- 클로저를 정확하게 이해하고 사용하는 것이 중요
|
|
- Result
익명 함수 변수에 할당 -> 50
Closure 예제 -> 25
카운팅 예제
|
|
-
Result
Count -> 1
Count -> 2
Count -> 3
Count -> 4
Count -> 5
함수를 새로운 변수에 할당 시 초기화
Another Count -> 1
Another Count -> 2
Another Count -> 3