본문 바로가기
SK 행복성장캠퍼스/Python 기초

0903_4일차_함수_일급객체

by NickNuma 2020. 9. 6.

함수에 대한 내용 중 일급객체에 대해 설명하려고 합니다.

 


일급 객체는 파이썬 뿐만 아니라 자바 스크립트에서도 사용되는 개념입니다.
1) 함수를 변수에 저장할 수 있으며
2) 함수를 함수 호출 시 인자값으로 사용할 수 있고
3) 함수를 함수의 리턴값으로 사용할 수 있다.

함수를
1) 호출 ( funtion() )로 사용할 수 있으며
2) 변수에 저장하여 (variable = function) 사용할 수도 있습니다. <= 1급 객체

"""
    * 일급 객체 (first - class)   ==>   자바스크립트, 파이썬
    ===> 주요한 핵심 개념 => 함수를 하나의 데이터로 보고 처리함.

    특징
        1) 함수를 변수에 저장할 수 있다.
        2) 함수를 함수 호출 시 인자값으로 사용할 수 있다.
        3) 함수를 함수의 리턴값으로 사용할 수 있다.
    ==================> 람다 함수에서 매우 중요한 개념으로 활용.

    * 함수가 정의되면 분석단계(실행 전 단계인 파싱(parsing))에서 내부적으로 동작되는 작업
        def fun1():             def 함수명/변수명():
            print("fun1")           print("fun1")       ===> fun1 = 함수 데이터 (*****)

        1) 함수명으로 된 변수 선언
            fun1 = None
            (함수 이름의 변수)
        2) def 함수명()에 해당되는 객체를 생성 (임의의 메모리 번지에 함수개체(함수데이터)가 저장된다. (200번지))
        3) 함수명 변수에 200 번지에 저장된 함수(=데이터)를 저장한다.  (함수 = 일반 데이터형)
            fun1 = 함수데이터    # 주소 번지만 들고 있음.

            (return 값에 따라서 함수 데이터의 데이터 타입이 달라짐)

            * fun1 활용 방법 2가지
            1) 일반적인 함수 호출
                fun1()      # 함수의 기능을 실행(함수 호출) 할 수 있는 syntax
            2) fun1 자체 변수로 활용이 가능하다. *** #1급 객체
                m = fun1    # fun1은 함수 데이터의 주소를 갖고 있고 주소를 넘겨줌.
                가. 일반변수에 함수 변수를 저장 : m = fun1
                나. 함수호출시 인자값으로 함수전달 가능

"""

 


함수 객체함수의 주소값을 가진 데이터값입니다.
함수 객체는 변수에 저장하여 사용합니다. 변수에 저장되지 않고 사용하려면 기존의 방법대로 function() 함수를 호출하는 방식으로 사용해야합니다.

print("시작")                    # 시작
n = 10                          #일반 변수

def fun1():                     #함수 변수 ==> fun1 = 함수데이터
    print("fun1 함수 실행")

# fun1 -> <class 'function'>, 함수데이터는 그냥 부르면 주소값만 알려줌 <function fun1 at 0x0000022474697790>
print(n, fun1, type(fun1))      # 10 <function fun1 at 0x0000022474697790> <class 'function'>
fun1()                          #일반 함수 호출법 => 함수 변수는 기능하기 위해서(사용하기 위해서), 함수처럼 사용해야함.
print("종료")                    # 종료

 

일반 변수에 함수 데이터를 저장 가능합니다.

print("시작")                    # 시작
def fun1():                     # fun1 = 함수 데이터명, 함수의 주소값이 있음
    print("fun1 함수 실행")

#1. 일반적인 함수 사용 (일반 함수 호출)
# fun1()

#2. 일급 객체로써 함수 사용
# 가. 일반 변수에 함수 데이터 저장 가능
m = fun1                        # 변수 m으로도 fun1 함수를 호출할 수 있어짐
m()                             # fun1 함수 실행  #변수m으로 함수 호출하는 것처럼 사용 가능 -> fun1 함수 실행
print("종료")                    # 종료

 

콜백함수로 사용 = 트리거 = 사용자가 호출하지 않고 내부적으로 시스템이 특정 시점에 호출하는 함수
함수 호출
인자값으로 함수를 전달하여 A 함수를 이용해 B함수를 호출하는 경우(함수).

콜백함수 (시스템이 특정시점에 호출하는 함수)  ==> 임의의 함수 호출시 인자값으로 함수 전달 가능

"""
    콜백함수 ?
    1) 시스템이 특정시점에 호출하는 함수
    2) 구현방법
        - 사용자가 임의의 함수를 호출할 때(x) 인자값으로 콜백함수명을 전달한다.

"""
#나. 함수 호출시 인자값으로 함수전달 가능        ===> 콜백함수(callback) = 트리거(trigger)
#   콜백함수?   사용자가 호출하지 않고 내부적으로 시스템이 특정 시점에 호출하는 함수

def xxx():              #xxx = 함수데이터
    print("xxx")
def zzz():              #zzz = 함수 데이터
    print("zzz")
def yyy(n):              #yyy = 함수데이터
    n()

# 사용자는 yyy함수 호출 -> yyy함수가 xxx 함수 데이터를 Parameter로 받아서 xxx함수를 실행
yyy(xxx)        # xxx       # yyy(n) --> yyy(xxx) --> xxx() --> print("xxx")
yyy(zzz)        # zzz       # yyy(n) --> yyy(zzz) --> zzz() --> print("zzz")
def xxx(f):
    print(("xxx"))
    f()

xxx(fun1)               # xxx #fun1  #함수를 인자값으로 사용
# 콜백함수 y와 z
def y():                    # y = 함수 객체
    print("Y함수 콜백")
def z():                    # z = 함수 객체
    print("Z함수 콜백")

# 시스템적으로 콜백함수를 호출하는 함수
def x(f):                   # x = 함수 객체
    print("x함수 start")
    f()
    print("x함수 end")
x(y)            # x함수 start # Y함수 콜백 # x함수 end
x(z)            # x함수 xtart # Z함수 콜백 # x함수 end

 


함수 객체에 다른 값을 덮어씌우면 해당 함수는 소멸합니다.
고로, 덮어씌운 이후 해당 함수 객체를 함수로 불러오면 Error가 발생합니다.

def fun1():           # fun1 = 함수 객체
    print("fun1")
fun1 = 10             # 함수 객체 fun1에 정수 int를 overwrite함
fun1()                # 에러 발생     # fun1의 함수 데이터는 int값을 덮어씌우면서 사라져서 Error

 


 

대충 이해한 것 같은 느낌의 개념.
코드에 다 써놯으니.... 보고 이해했으면...... ( 하루 종일 붙잡고 있어서 그런가... 멀미남;;; ㅎㅎㅎ 죄송;; ㅎㅎㅎ;)

# 3. 임의의 함수 호출시 리턴값으로 함수를 사용 가능
#이거 이해 안 감. 이해해보자.
def kkk():
    return fun1     # 함수의 반환(리턴)값 fun1

result = kkk()      # result에 함수   이거 왜 함수로 줘야함? 함수 객체가 아니라?
result()            # 생각에 함수 객체는 return값을 얻는게 아니라 함수 흐름만 가져오는 듯. (주소를 갖고 있는 변수. return값은 없는?)
print("="*50)

#뭔가 이해하는 중임 , 다시 살펴보셈
def fun1():             # fun1 = 함수 객체, 반환값 x
    print("fun1")       # fun1 함수 주소로 가면 이런 절차가 있음.

def aa():           # aa 함수 일급 객체는 return 값이 아니라 함수 흐름에 fun1() 호출이 있음
    fun1()
abc = aa            # abc는 aa 함수를 데이터로 갖음
abc()               # fun1        # abc() -> fun1() -> print("fun1)

 

아.. 진짜 좀 어지러워서.. 몇 분이라도 쉬고 와야할 듯....

그럼 이만!

반응형

댓글