AIFFEL에서 배운 first-class object와 closure를 정리하자.
사실 일급 객체라는 내용은 공부하면서 크게 중요도를 느끼지 못했다.
그치만, 나중에 '아~ 함수가 일급 객체이기 때문에 그렇구나' 라는 느낌이 있어 정리한다.
일급 객체 조건
1. 변수에 할당되거나, 자료구조에 담길 수 있다.
2. 함수의 parameter로 들어갈 수 있다.
3. 함수의 return 값으로 들어갈 수 있다.
이 조건을 보면 우리가 쓰고 있는 int, float, str 등이 모두 일급 객체임을 알 수 있다.
int를 예시로 들어보면,
하지만 제일 중요한 것은 따로 있는데,
이제 이 부분을 확인해보자
모든 조건을 만족시켜, 일급객체라는 것을 증명했다.
# 대표적인 callback 형태
map(add_2,test_list)
이때, map은 함수를 인자를 받고 있기에 고차함수이며, 호출당하는 add_2는 콜백함수라고 한다.
Q) 왜 callback 이라 말하는가??
A) 원래는 사용자가 쓴 코드에서 함수를 호출하는 것이 정방향
이렇게 반대로 호출해서 call + back 이라고 한다.
사실 이번 내용들은 모두 closure를 이해하기 위한 buildup 이다.
그렇기에 두번째 내용으로는 변수의 범위를 이해해야 한다.
변수 종류
- 전역변수 : 코드 전체에서 접근할 수 있는 범위 ( 전역 범위 : 전역 변수 접근 범위 )
- 지역변수 : 함수 안에서 접근 가능한 변수 ( 지역 범위 : 지역 변수 접근 범위 )
모든 변수는 외부에서 읽어오는 것은 허용하지만, 쓰는 것은 제한적이다.
보면, x에 대한 수정하는 것은 '특별한 언급'이 없다면, 모두 local 변수로 보기 때문에 참조할 값이 없다고 나오는 것이다.
→ 특별한 언급은 뒤에서 global, nonlocal을 통해 배운다.
검은색으로 표시된 부분이 전역범위이다.
함수 내부와 외부에서 모두 잘 불러온다.
검은색 표시가 지역범위이다.
함수 내부에서는 불러올 수 있지만, 외부에서의 변수 호출은 불가하다.
우리는 이제 위에서 말한 '특별한 언급'을 배울 것이다.
# global a = 10 이런 식으로 붙여서 쓸 순 없다.
global a
global 역할
- 전역변수가 생성되어 있지 않다면, a를 전역변수로 생성한다.
- 전역변수가 생성되어 있다면, 전역변수 a를 가져온다는 의미
# 동일하게 nonlocal a = 10 은 불가하다.
nonlocal a
알아두어야 할 점은, 지역변수가 없다고 지역변수를 생성하지 않고 오류 출력
global과 동일하게 외부 영역에 있는 지역변수를 불러와 수정할 수 있다.
+) 변수 호출
x라는 변수를 호출하게 되면, x를 찾을 때가지 여러 scope (영역)에서 찾게 된다.
1. local scope : 함수 내부 영역
2. nonlocal(enclosing) : 해당 함수를 감싸고 있는 영역
3. global : 메인 프로그램 영역
4. built-in : 키워드나 에러 exception이 담긴 공간
위 과정과 동일하게 nonlocal 변수는 global 이하의 영역면서 local 이상인, 즉 nonlocal 영역에 있다면, 우선순위는 nonlocal 키워드와 가까운 순으로 높다.
nonlocal과 global을 함께 쓴 코드를 보고 복습해보자