First Class Function은 프로그래밍 언어가 함수를 ⚡️first-class citizen(일급객체) 로 취급하는 것을 뜻합니다. 평소에 다루던 객체(숫자, 문자열 그리고 클래스)를 다루는것처럼 함수도 동일하게 취급하는것 이라고 생각하면 쉽다.
🕹 First Class Citizen(일급객체) 란?
1. 변수 또는 데이터구조에 할당할 수 있다.
2. 인자로써 다른 함수의 매개변수로 전달 가능하다.
3. 다른 함수의 리턴값으로 사용 될 수 있다.
🕹 i. 함수를 변수에 할당하고 인자로써 다른 함수의 매개변수로 전달해보자
f 에 add 함수주소의 반환값을 할당하고 add 와 f 를 출력해보면 메모리 주소 값이 같다. 🤭
print(f(5,5))
코드를 입력해보면 이제 f가 add 함수처럼
동작하는것을 확인할 수 있다.
🕹 First Class Function의 재사용성, DRY(Don't repeat yourself)
simple 함수를 이용해 간단하게 구현도 가능하지만, 만약 add, multiply, divide, 등 여러 함수가 존재할때 First Class Function 쓰게 된다면 미리 만들어진 코드를 ⚡️재사용가능하다는 장점이 있다.😎
프로그래밍 언어에서의 클로저란 네임 바인딩 기술이다. 클로저는 어떤 함수를 함수 자신이 가지고 있는 환경과 함께 저장한 레코드이다. 또한 함수가 가진 프리변수(free variable)를 클로저가 만들어지는 당시의 값과 레퍼런스에 맵핑하여 주는 역할을 한다. 클로저는 일반 함수와는 다르게, 자신의 영역 밖에서 호출된 함수의 변수값과 레퍼런스를 복사하고 저장한 뒤, 이 캡처한 값들에 액세스할 수 있게 도와준다.
🕹 i. 내부 함수에서 외부 함수 변수 참조
1. return inner_ function -> 출력되지 않음(함수의 주소만을 반환한다.)
2. return inner_function() -> 출력: hello (함수호출과 반환을 동시에)
⚡️message 변수는 inner_function 안에 선언이 되지 않았지만 outer_function 블럭 안에 inner_function 과 message 함께 선언됬기 때문에 inner 블럭 안에서도 참조가 가능합니다.
🕹 ii. 자신의 영역 밖에서 호출된 함수의 변수값
분명 outer_function 함수호출은 result 변수에 함수 주소를 할당해주고 끝났을텐데 이상하게도 print(result())를 해보면 outer_function의 로컬변수인 message를 참조를 하고 있습니다.
closer는 프리변수를 저장하고 이 값들에 대해 접근을 허용하게 해준다.