파이썬

파이썬(python) - 일급 객체(first-class citizen)

티베트 모래여우 2020. 10. 9. 20:01
반응형

일급 객체(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라는 매개변수를 기억하고 있는가?

이는 클로저 함수와 관련된 내용이며, 추후 다루도록 하겠습니다.

나중에 계속됩니다

 

반응형