파이썬(python) - 일급 객체(first-class citizen)
일급 객체(First-class citizen)란?
일급 객체는 OOP에서 사용되는 개념 중 하나로 아래의 조건을 만족하는 객체를 의미합니다.
1. 변수 혹은 데이터 구조(자료구조) 안에 담을 수 있어야 한다.
2. 매개변수로 전달할 수 있어야 한다.
3. 리턴값으로 사용될 수 있어야 한다.
파이썬에서의 일급 객체
파이썬에서는 함수도 위의 일급 객체의 조건을 만족합니다.
즉 함수를 변수에 할당할 수 있고, 매개변수로 전달도 가능하며, 리턴 또한 가능합니다.
이는 추후 클로저(closure)와 데코레이터(Decorator)를 이해하는데 필수적인 개념이므로 한번 짚고 넘어가 봅시다.
1. 변수 혹은 데이터 구조 안에 함수를 담을 수 있다.
def func1(a, b): # 두 수를 더한 값을 리턴하는 func1 함수 선언
return a + b
f1 = func1 # f1이라는 변수에 func1 함수를 할당
print(func1)
print(f1) # func1함수와 f1의 메모리 주소를 출력, 같은 주소를 가리킴
print(f1 is func1) # is 함수로 비교
print(f1(1, 2))
print(func1(1, 2))
출력 결과
<function func1 at 0x000001A568285D38>
<function func1 at 0x000001A568285D38>
True
3
3
상기한것처럼 단순히 변수가 아니라 자료구조에 할당 할 수도 있습니다.
리스트에 할당
def add(a, b):
return a + b
def mins(a, b):
return a - b
calc = [add, mins]
for i in calc:
print(i(10, 5)) # 15와 5를 출력
딕셔너리에 할당
def add(a, b):
return a + b
def mins(a, b):
return a - b
calc = {
"add": add,
"mins": mins,
}
num1 = calc["add"](10, 5)
num2 = calc["mins"](10, 5)
print(num1) # 15
print(num2) # 5
2. 매개변수로 함수를 전달할 수 있다.
def add(a, b):
return a + b
def add_manager(func, a, b): # 함수를 매개변수로 받음
print(func(a, b)) # 매개변수로 받은 함수를 통한 연산
add_manager(add, 1, 2) # 매개변수로 add함수를 전달하고 3을 출력하게 됨
3. 함수를 리턴값으로 사용할 수 있다. (또한 함수를 함수 내에서 선언이 가능합니다.)
def hello(name): # 1
def printer(): # 2
print(f"Hello {name}!") # 3
return printer # 4
func = hello("Fox") # 5
func() # 6
이해를 돕기 위해 최대한 간소하게 만들어 보았습니다.
# 1) 먼저 name을 매개변수로 하는 hello 함수를 선언
# 2) hello 함수 내부에 printer라는 함수를 선언
# 3) printer함수는 hello함수에서 받은 name을 "Hello {name}!"의 형태로 출력
* name변수는 printer함수보다 상위 스코프인 hello함수에서 선언되었으므로 printer함수에서 접근이 가능합니다.
# 4) printer함수를 리턴
# 5) func라는 변수에 hello함수에 "Fox"라는 문자열을 준 반환값을 저장
# 6) func를 실행하면 "Hello Fox!"가 나온다.
그런데 여기서 의문이 생기시는 분들도 계실겁니다.
분명 hello 함수는 실행이 끝났는데 어떻게 Fox라는 매개변수를 기억하고 있는가?
이는 클로저 함수와 관련된 내용이며, 추후 다루도록 하겠습니다.