스터디 그룹/ProjectH4C

ProjectH4C 1개월 2주차 과제 (UNIT 29,30,31) 여기도 스택프레임이.

파이썬에서 함수는 매우 쉽게 느껴졌다. 그래서 중요한 부분, 생각하지 못한 부분 위주로 복습을 하였다.

그렇기 때문에 실제 파이썬 코딩도장의 내용 순서가 좀 달라질 수는 있다.

 

📖 UNIT 29. 파이썬 함수

📒함수 독스트링 (documentation strings)

우선, 독스트링이란 함수의 사용법이나 그런 설명을 담아놓은 문자열을 의미한다.

def a():
    '''a is mm0ck3r'''
    pass

위와 같은 함수를 만들어보자.

이렇게 함수에 대한 설명부분을 담고있다. help(a) 위와 같으 방법을 사용해도 된다.

📒함수의 호출 과정 알아보기

함수는 어떻게 호출되고 어떻게 다시 원래 함수로 돌아가질까. 리버싱 공부를 하면서 대충 알기는 했지만, 파이썬에서도 한 번더 공부를 해보자.

 

def mul(a, b):
    c = a * b
    return c
 
def add(a, b):
    c = a + b
    print(c)
    d = mul(a, b)
    print(d)
 
x = 10
y = 20
add(x, y)

이 코드는 코딩도장에 있는 코드이다. 천천히 살펴보자면, 먼저 x와 y에 값을 할당해주고 add함수를 호출한다.

이후 add함수에서 mul함수를 또 호출한다.

 

프로그램 시작 => add()함수 호출 => mul()함수 호출 => mul()함수 탈출 => add()함수 탈출 => 원래함수 복귀

 

개인적으로 리버싱 핵심원리의 스택프레임이 더 잘 설명한다고 생각한다. 분석을 쉽게 하고 싶으면 줄번호가 붙어있는게 좋다.

먼저 프레임이라는 개념을 이해해보자. 프레임은 메모리에서 함수와, 함수에 속한 변수가 저장되는 독립적인 공간이다.

특히 함수 전체에 접근할 수 있는 프레임을 전역 프레임이라고 한다. (Global Frame)

 

첫 번째 줄 부터 생각을 해보자. 함수를 선언해주고 있다. mul()함수, add()함수를 선언해주고 x, y 변수에 값을 할당해준다.

이후에 add()함수를 호출하게 된다.

 

mul  
add  
x 10
y 20

 

만약 12번째 줄까지 실행이 되었다면, 전역 프레임은 위와 같은 형태를 띄고 있을 것이다.

여기서 이제 add함수의 스택 프레임이 형성될 것이다. 그 때는

mul  
add  
x 10
y 20
a 10
b 20
c 30

이렇게 위의 전역프레임이 있고, 밑의 add()함수에서 스택프레임을 형성하게 된다. mul()함수를 또 호출 하므로 스택프레임이 하나 더 형성된다.

mul  
add  
x 10
y 20

 

a 10
b 20
c 30
a 10
b 20
c 200

밑에 한 개 더 생긴 스택프레임은 mul() 함수 내에서 생긴 스택프레임을 의미한다.

위와 같이 스택프레임이 형성되고, mul()함수가 끝났을 때 mul의 스택프레임에서 c는 add()의 d로 올라가게 된다.

mul  
add  
x 10
y 20
a 10
b 20
c 30
d 200

그래서 위와같은 구조를 띄게 된다.

 

그리구 끝나게 된다. 전역프레임은 파이썬이 끝날 때 사라지게 된다.

 

c언어에서는 어셈블리어로 직접 스택프레임을 공부해봤는뎅 파이썬에서는 좀 더 자세히 다음에 연구해봐야겠다.

 

📖 UNIT 30. 위치 인수와 키워드 인수

📒위치 인수와 리스트 언패킹 사용하기

print(10, 20, 30)

위와 같은 방법으로 인수를 넘기는 방식을 위치인수라고 한다. 한마디로 인자(인수?)를 그냥 넘기는 순서의 방법을 의미하는 것 같다.

 

리스트나 튜플 안에 있는 값들을 인수로 사용하고 싶을 수도 있다.

 

a = [10, 20, 30]
b = (10, 20, 30)

print(*a)
print(*b)

위와 같이 '*' 이 문자를 리스트나 튜플 앞에 분여준다면 인수로 사용할 수 있다.

딩동댕동 그럼 이런 방식은 왜 사용하는걸까. 바로 인자의 갯수가 정해지지 않은 함수에서 사용이 된다.

print 함수는 인수가 한개, 두개, 세개 ... n개가 들어가도 상관이 없다. 그렇기 때문에 이런 방법으로 인수를 넘기는 것이다.

 

📒키워드 인수 사용하기

위의 위치인수 방법을 사용할 때 인수마다 사용되는 용도가 다르다면, 그 순서를 외울 때 어느정도 힘들어질 것 같다.

이를 방지하기 위해 키워드 인수를 사용하는 것이다.

personal_info('홍길동', 30, '서울시 용산구 이촌동')
personal_info(name='홍길동', age=30, address='서울시 용산구 이촌동')

그래서 위와같이 쓸 수 있다.

위의 경우는 딕셔너리로 값을 넘길 수도 있다.

 

하지만 딕셔너리는 쌍으로 이루어져 있기에 *를 두번 써야한다.

 

📖 UNIT 31. 재귀함수

재귀함수로 팩토리얼을 구해보자.

f(n) = f(n-2) + f(n-1) 이다.

 

성공했다.

 

팩토리얼은 기초이니 여기서 끝내겠다.