외부 변수 접근 : 클로저
12 클로저
외부 변수 접근 : 클로저

'함수' 챕터에서 '익명 함수'에 대해 배웠습니다. Go언어에서 함수는 일급 함수(First-Class Function)이기 때문에 익명 함수를 활용할 수 있습니다. 함수 자체를 다른 객체들과 마찬가지로 함수형으로서 매개변수와 반환값으로 쓸 수 있는 것입니다. 이번 강의에서 배울 클로저는 함수 안에서 익명 함수를 정의해서 바깥쪽 함수에 선언한 변수에도 접근할 수 있는 함수를 말합니다. 쉽게 말해서, 함수안에서 바깥 변수를 사용하려면 매개 변수를 사용해 Pass by value 형식이나 Pass by reference 형식으로 사용해야합니다. 그런데 익명 함수는 클로저이기 때문에 외부 함수의 변수를 그냥 접근할 수 있습니다.


아래 클로저를 이용해 함수 외부 변수를 접근하는 아주 간단한 예시를 보겠습니다. 

실행 언어: go

함수 안에서 함수를 정의하기 위해서 당연히 익명 함수만 쓸 수 있습니다. 위 예시에서는 main() 함수 내에 선언된 익명 함수들이 main() 함수의 변수를 매개변수 없이 접근합니다.

지난 강의에서 함수 자체를 매개변수로 전달받는 것은 배웠는데 함수 안에서 함수를 반환하는 것은 이번 강의인 '클로저' 챕터에서 배운다고 했습니다. 이를 활용하는 간단한 예제를 살펴보고 알아보겠습니다. 아래 코드를 바로 실행해보세요.

실행 언어: go
실행 결과를 확인해보세요!

next 함수는 반환형으로 func() int 를 입력해 매개변수가 없고 반환형이 int인 함수형을 선언했습니다. next 함수는 변수 i를 지역 변수로서 0으로 초기화하고 이를 1 증가시키는 익명 함수를 반환합니다. 그리고 이 함수를 nextInt라는 변수에 초기화합니다.  출력되는 결과 값을 확인해보면 nextInt를 실행할 때마다 값이 초기화 되는 것이 아니라 이전의 흐름에 이어서 1을 증가 시킵니다.


왜냐하면 i의 연산 기능을 하는 익명 함수 안에서 i가 선언되지 않고 익명 함수 밖에 있는 변수 i를 참조하고있기 때문입니다. 익명 함수 자체가 지역 변수로 i를 갖는 것이 아니기 때문에 외부 변수 i가 상태를 계속 유지하면서 값을 1씩 증가시키는 기능을 하게 됩니다. 그리고 새로운 변수인 newInt에 새롭게 함수를 초기화하면 새로운 클로저 함수 값을 생성해 변수 i는 다시 0으로 초기화됩니다.

질문하기
추가 자료
no files uploaded

추가 자료가 없습니다

여기서 새로운 학습 자료를 확인하세요!
선생님이 추가한 자료들을 바로 확인할 수 있어요.