Go Lang 기초 7 - 함수 func
지금까지는 함수에 대한 특별한 안내가 없었지만 Go Lang에서 미리 정의된 함수를 충분히 잘 활용해왔습니다.
지금부터는 함수를 조금 더 상세히 알아봄으로써 Go Lang에 미리 정의된 함수 외에도 직접 함수를 정의하고 활용해보도록 합시다.
Go Lang에서 함수는 func를 통해 나타냅니다.
Go Lang에서 함수 func에는 { 이 반드시 같은 줄에서 시작되어야합니다.
함수의 기본 형태
func 함수명 (매개변수 type)
처음 우리가 func을 만난 것은 func main() {} 의 형태였습니다. 기본 형태를 알았으니 이제 우리는 func main()이 main함수를 의미하는 것임을 알 수 있습니다.
함수에 인자를 전달하기 위해서는 하나 이상의 매개변수(Parameter)를 선언해주어야 합니다. 둘 이상의 매개변수는 ,를 통해 구분해줍니다.
func add (var a int, var b int) {
}
위와 같은 함수가 있다고 해봅시다. add라는 함수명을 가진 함수 안의 a와 b는 각각 정수형(int)으로 선언된 매개변수입니다.
func 함수 안에 다음과 같이 선언된 변수는 지역(local)에 종속된 지역변수입니다. 따라서 a와 b는 함수 사용 지역 외에서의 사용은 되지 않습니다.
먼저 swap이라는 이름의 함수를 만들어봅시다.
func swap(a int, b int) {
temp := a
a = b
b = temp
fmt.Printf("a = %d, b = %d\n", a, b)
}
func 뒤에 swap으로 함수 이름을 작성하고 매개변수 a와 b를 각각 정수형(int) 선언합니다. a와 b의 위치를 바꾸기 위해 temp 변수를 정의하여 a와 b의 값을 서로 넘겨주는 함수 형식을 제작합니다. fmt.Printf 함수를 통해 a와 b 값을 한 눈에 알아볼 수 있게 출력합니다.
데이터타입 %d?
정수값(int)를 부호가 있는 10진수의 형태로 출력
swap함수를 정의했으니 이제 swap함수가 제대로 작동할 수 있게 main함수를 작성합니다.
package main
import "fmt"
func main() {
a := 1
b := 2
swap(a, b)
}
func main함수 안에 a와 b를 각각 정수형 1, 2 변수로 선언하고 swap 함수의 매개변수로 지정하였습니다. main함수는 swap함수를 실행시켜 줄 것입니다.
예제. swap 함수 만들기
package main
import "fmt"
func main() {
a := 1
b := 2
swap(a, b)
}
func swap(a int, b int) {
temp := a
a = b
b = temp
fmt.Printf("a = %d, b = %d", a, b)
}
출력결과물
a = 2, b = 1
위의 예제를 통해 우리가 만든 swap함수가 잘 실행되어 a와 b의 값이 서로 swap되었음을 확인합니다.
지금은 조금 생소하지만 곧 알아보게될 포인터라는 개념을 통해서 해당 식을 조금 더 상세히 분석해볼 수 있습니다.
예제. 포인터를 활용해 swap 함수 사용하기
package main
import "fmt"
func main() {
a := 1
b := 2
fmt.Printf("a = %d, b = %d \n", a, b)
fmt.Println("호출 후")
swap(&a, &b)
}
func swap(i *int, j *int) {
temp := *i
*i = *j
*j = temp
fmt.Printf("a = %d, b = %d \n", *i, *j)
}
&a는 a := 1에서, a의 값(1)을 저장한 주소값을 나타냅니다.
&b는 b := 2에서, b의 값(2)을 저장한 주소값을 나타냅니다.
여기서 포인터 을 사용하여 i, *j로 주소를 찾아 해당 주소값에 저장된 값을 저장합니다.
정수값 a, 정수값 b, 주소값 j, 주소값 i가 차례대로 메모리 스택의 아래에부터 쌓이며 그 가장 위에 temp 변수가 저장됩니다.
위의 예제의 변수들이 메모리에 저장된 순서 (Last in First Out 방식)
temp 변수 *i (주소값) *j (주소값) b (정수값) a (정수값)
함수 실행 시 i가 먼저 주소를 찾아가서 b 자리에 있는 정수값 2를 정수값 1로 대체하고, j가 a 자리의 정수값 1을 2로 대체하여 swap이 완성됩니다. swap함수의 지역변수인 temp는 이 과정이 끝나면 사라집니다.
swap함수의 실행결과가 main함수에 반영되면서 최종 결과물을 출력합니다.
출력결과물
a = 1, b = 2
호출 후
a = 2, b = 1
이번에는 if문을 활용한 Divide 함수를 만들어보도록 합시다.
func main() {
mok, suc := divide(4, 2)
fmt.Println(mok, suc)
}
몫은 mok, 나눗셈 성공 여부를 suc로 확인할 수 있도록 작성합니다.
이제 divide 함수를 통해서 divide(4, 2)라는 함수에 의미를 부여해줍니다.
func divide(a int, b int) (int, bool) {
함수 divide는 정수형 a와 b를 매개변수로 하는 함수입니다. 각각 결과값이 int, bool형으로 나타날 수 있게 함수와 { 사이에 타입을 지정해줍니다.
나눗셈에서 0으로 나누는 식은 허용되지 않기 때문에 b값에 0이 오면 오류 메시지를 반환할 수 있도록 if문을 활용합니다.
if b == 0 {
return 0, false
}
return a / b, true
}
b == 0이 아니면 if문은 a / b를 리턴하도록 합니다. 이제 이 소스 코드들을 조립해서 하나의 완성된 코드를 실행시켜봅시다.
예제. divide 함수 만들기
package main
import "fmt"
func main() {
mok, suc := divide(4, 2)
fmt.Println(mok, suc)
}
func divide(a int, b int) (int, bool) {
if b == 0 {
return 0, false
}
return a / b, true
}
출력결과물
2 true
divde(4, 0)과 같이 0으로 나눌 경우 0 false를 반환
'IT > Develop' 카테고리의 다른 글
Go Lang 기초 9 - 슬라이스(Slice) (0) | 2021.07.28 |
---|---|
Go Lang 기초 8 - 배열(Array) (0) | 2021.07.28 |
Go Lang 기초 6 - 반복문 For (0) | 2021.07.28 |
Go Lang 기초 5 - 조건문 Switch (0) | 2021.07.28 |
Go Lang 기초 4 - 조건문 if (0) | 2021.07.28 |