클로저

Lua 2010. 2. 9. 11:18


어떤 함수를 다른 함수안에 포함해 작성했을 경우, 이 함수는 자신을 포함하고 있는 함수에 선언된 지역 변수에 접근할 수 있다. 이 기능을 정적 범위 지정 기능이라고 부른다.

예)
name = {"peter", "paul", "mary"}
grades = {mary = 10, paul = 7, peter = 8}

table.sort(
 names,
 function(n1, n2)
  return grades[n1] > grades[n2]
 end
 )

이 작업을 함수로 감싸보자.

function sortByGrade(names, grades)
 table.sort(
  names,
  function(n1, n2)
   return grades[n1] > grades[n2]
  end
 )
end

잘 보면 sort에 넘기는 익명 함수가 sortByGrade 함수에서 지역변수로 선언된 grades에 접근한다. 이 익명 함수의 내부에서 grades는 전역 변수도 지역 변수도 아니며, 비지역 변수로 불린다.

다음 코드도 한번 살펴보자.

function NewCounter()
 local i = 0
 return function()
  i = i + 1
  return i
 end
end

이 코드에서 익명 함수는 자신의 횟수를 유지하기 위해 비지역 변수 i를 참조한다. 하지만 이 변수를 생성한 함수는 이미 실행을 끝냈으므로 익명 함수를 호출하는 시점에 이미 i는 유효범위 밖에 있다. 그럼에도 루아는 클로저라는 개념을 사용하여 이러한 상황을 정확하게 처리해준다. 간단히 요약하면, 클로저는 하나의 함수와 그 함수가 정확하게 접근해야 하는 모든 비지역 변수를 합한 것을 말한다. newCounter를 다시 호출하면 새로운 지역 변수 i가 생성되고, 이 새로운 변수와 함께 동작하는 새로운 클로저를 얻는다.

Posted by 명혀니
,