[Python] 일급 객체(first-class object)

cdwde·2021년 5월 10일
0

🎈 일급 객체(first-class object)란?

  • OOP(Object Oriented Programming)에서 사용되는 개념 중 하나

  • 변수나 데이터 구조에 넣을 수 있어야 한다

  • 매개변수에 전달할 수 있어야 한다

  • 반환값으로 사용할 수 있어야 한다


🎈 일급 함수(first-class function)란?

  • 함수를 다른 변수와 동일하게 다루는 언어는 일급 함수를 가졌다고 표현

  • 함수를 다른 함수에 매개변수로 제공하거나, 함수가 함수를 반환할 수 있으며, 변수에도 할당할 수 있다

  • 파이썬의 함수는 일급 함수

1. 함수를 변수나 자료구조에 저장할 수 있다

  • 예제1 (변수에 할당)
def func(a, b):
    return a + b

k = func   #k라는 변수에 func 함수 할당

print(func)
print(k)    #func 함수와 k는 같은 주소를 가리킨다
print(k is func)
print(k(1, 2))

#출력 결과
#<function func at 0x017FC4A8>
#<function func at 0x017FC4A8>
#True
#3
  • 예제2 (자료구조- 리스트에 할당)
def add(a, b):
    return a + b
def minus(a, b):
    return a - b

calc = [add, minus]

for i in calc:
    print(i)

for i in calc:
    print(i(10, 5))
    
#출력 결과
#<function add at 0x0193C4F0>
#<function minus at 0x0193C4A8>
#15
#5
  • 예제3 (자료구조 - 딕셔너리에 할당)
def add(a, b):
    return a + b
def minus(a, b):
    return a - b

calc = {
    "add": add,
    "minus": minus,
}

num1 = calc['add'](10, 5)
num2 = calc['minus'](10, 5)

print(num1, num2)

#출력 결과
#15 5

2. 함수를 인자로 사용할 수 있다 (매개변수로 함수를 전달할 수 있다)

  • 예제1
def add(a, b):
    return a + b
def add_func(func, a, b):   #매개변수로 함수 받음
    print(func(a, b))

add_func(add, 1, 2)

#출력 결과
#3
  • 예제2
def square(x):
    return x*x

def cube(x):
    return x*x*x

def my_func(func, args_list):
    result = [func(i) for i in args_list]
    return result

l = [1, 2, 3, 4, 5]
ans = my_func(square, l)
print(ans)

ans2 = my_func(cube, l)
print(ans2)

#출력 결과
#[1, 4, 9, 16, 25]
#[1, 8, 27, 64, 125]

3. 함수를 리턴값으로 사용할 수 있다

def func(name):
    def printer():		 #클로저
        print(f'Hello {name}')
    return printer

print(func)
f = func("NAME")
f()

#클로저는 다른 함수의 지역변수를 그 함수가 종료된 이후에도 기억할 수 있다
del func

try:
    print(func)
except NameError:
    print('NameError: func는 존재하지 않습니다')

f()

#출력 결과
#<function func at 0x01AAC4F0>
#Hello NAME
#NameError: func는 존재하지 않습니다
#Hello NAME
  • printer를 리턴값으로 리턴하여 f라는 변수에 할당한 후 호출한 것을 볼 수 있음

  • name 같은 함수의 지역변수 값은 함수가 호출된 이후에 메모리상에서 사라지므로 다시 참조할 수 없는데 f 변수에 할당됐던 'NAME'값이 func 함수가 종료된 이후에도 참조가 됨

  • 이러한 printer 같은 함수를 클로저(closure) [Python] 클로저(closure)


참고
https://developer.mozilla.org/ko/docs/Glossary/First-class_Function
http://schoolofweb.net/blog/posts/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%8D%BC%EC%8A%A4%ED%8A%B8%ED%81%B4%EB%9E%98%EC%8A%A4-%ED%95%A8%EC%88%98-first-class-function/
https://dojang.io/mod/page/view.php?id=2371
https://tibetsandfox.tistory.com/8

0개의 댓글