클로저란 프로그래밍 언어에서 매우 강력한 개념 중 하나입니다. 클로저는 함수와 그 함수가 참조하는 변수들로 구성된 패키지입니다. 이 패키지는 함수가 정의된 범위를 벗어난 후에도 함수가 참조하는 변수들을 계속해서 접근할 수 있도록 합니다. Go 언어에서도 클로저를 사용할 수 있으며, 다양한 상황에서 유용하게 활용될 수 있습니다.
클로저의 기본 구조
Go 언어에서는 클로저를 선언하는 방법이 간단합니다. 클로저는 함수 리터럴과 변수를 조합하여 생성됩니다. 이렇게 생성된 클로저는 해당 함수가 선언된 범위에서 사용된 변수를 계속해서 참조할 수 있습니다. 예를 들어, 다음과 같이 클로저를 선언할 수 있습니다.
func main() {
num := 10
add := func(value int) int {
return value + num
}
result := add(5)
fmt.Println(result) // Output: 15
}
위의 예제에서 add
함수는 num
변수를 참조하고 있습니다. add
함수는 선언된 범위인 main
함수 내에서 사용되지만, main
함수가 종료된 후에도 add
함수는 num
변수를 참조할 수 있습니다.
클로저의 활용
클로저는 다양한 상황에서 유용하게 활용될 수 있습니다.
상태 정보 유지
클로저를 사용하면 함수가 호출될 때마다 상태 정보를 유지할 수 있습니다. 예를 들어, 다음과 같이 클로저를 사용하여 카운터를 구현할 수 있습니다.
func counter() func() int {
count := 0
return func() int {
count += 1
return count
}
}
func main() {
c := counter()
fmt.Println(c()) // Output: 1
fmt.Println(c()) // Output: 2
fmt.Println(c()) // Output: 3
}
위의 예제에서 counter
함수는 count
변수를 참조하는 클로저를 반환합니다. 이 클로저를 사용하면 호출될 때마다 count
변수의 값을 증가시킬 수 있습니다.
함수 팩토리
클로저를 사용하면 동일한 동작을 수행하는 여러 개의 함수를 생성할 수 있습니다. 예를 들어, 다음과 같이 클로저를 사용하여 덧셈, 뺄셈, 곱셈, 나눗셈 함수를 생성할 수 있습니다.
func calculate(operator string) func(int, int) int {
switch operator {
case "+":
return func(a, b int) int { return a + b }
case "-":
return func(a, b int) int { return a - b }
case "*":
return func(a, b int) int { return a * b }
case "/":
return func(a, b int) int { return a / b }
default:
return nil
}
}
func main() {
add := calculate("+")
fmt.Println(add(3, 4)) // Output: 7
subtract := calculate("-")
fmt.Println(subtract(10, 5)) // Output: 5
multiply := calculate("*")
fmt.Println(multiply(3, 4)) // Output: 12
divide := calculate("/")
fmt.Println(divide(10, 2)) // Output: 5
}
위의 예제에서 calculate
함수는 주어진 연산자에 따라 해당 연산을 수행하는 클로저를 반환합니다. 이 클로저를 사용하여 다양한 연산을 수행할 수 있습니다.
결론
Go 언어에서 클로저를 사용하면 함수와 변수들로 구성된 패키지를 만들 수 있습니다. 클로저를 사용하면 함수가 선언된 범위를 벗어난 후에도 변수를 계속해서 참조할 수 있으며, 이를 통해 다양한 상황에서 유용하게 활용할 수 있습니다. 클로저를 잘 활용하면 코드의 가독성과 유연성을 크게 향상시킬 수 있습니다.