7. 함수 > 7-1. 함수란?
함수란?
해당 파트는 아래 영상들을 시청 후 교안을 정독해주세요.
함수는 반복적으로 사용되는 기능을 하나의 부품으로 만든 것입니다. 기능이 필요할 때마다 매번 코드를 작성하기보다는, 이미 해당 기능이 내장된 부품으로서 함수를 가져와서 사용하기 위한 거죠. 이 경우 코드의 길이나 편리성 부분에서 엄청난 이점이 있겠죠?
우리는 이미 앞에서 꽤나 많은 함수들을 배웠어요. input()
, print()
, type()
등 과 같은 함수들이죠. 그치만 이 함수들은 파이썬 시스템에 내장되어 제공되는 함수들입니다. 이번 '함수' 챕터에서는 우리가 직접 함수를 만들어 볼 겁니다.
함수에 대해 본격적으로 알아보기 전, 간단히 함수의 형태를 알아봅시다. 함수의 기본 형태는 다음과 같습니다.
def 함수명 (매개변수):
수행문
수행문
...
여기서 매개변수는 값을 전달받는 변수를 지칭합니다. 좀 더 확실한 이해를 위해 아래 예시를 살펴봅시다.
def square (x):
y = x**2
return y
값을 넣으면 제곱값을 반환하는 함수를 만들었습니다. 이름은 제곱을 영어로 한 square
, 수행식은 매개변수에 제곱을 한 값을 y
변수에 할당하는 내용을 담고 있습니다. 그런데 그 후 return
은 뭘까요? return
은 함수의 출력값으로 무엇을 반환할지 지정해주는 기능을 합니다. 예컨대, 위 함수 square
에서는 y
, 즉 x
의 제곱값이 함수의 출력값이 되겠죠? square
함수에 실제로 값을 입력해보면 아래와 같이 기능합니다.
square(5) #출력값은 25
함수를 사용할 때는 살펴볼 점들이 있습니다. 기능도 모르고 무턱대고 쓸 수는 없으니까요. 살펴볼 점들은 아래와 같습니다.
그런데 이번엔 직접 함수를 만들어본다고 했죠? 그 말은, 위의 살펴볼 점들을 우리가 스스로 채워가야 한다는 거에요. 본격적으로 함수를 만들기 전, 위 요소들을 결정할 때 주의할 점들을 살펴보고 갈게요.
함수의 이름은 함수의 용도를 명확히 드러내야 합니다. 예컨대 사용자의 수를 세는 함수를 만들었다면 이 함수의 이름은 user_count()
정도가 될 수 있겠죠? 만약 귀찮은 마음에 user()
와 같이 함수 이름을 지었다면, 다른 이들이 함수를 보고 기능을 파악하기 어려울 거에요. 본인도 헷갈릴 수 있고요!
하나의 함수에는 하나의 용도 혹은 기능이 들어가는 것이 좋습니다. 예컨대 현재 접속한 사용자들을 대상으로 풍선 아이템을 주기로 했다고 할게요. 이를 balloon_to_active_user()
와 같이 하나의 함수로 만들 수도 있을 거에요. 그치만 다음 이벤트로는 접속한 사용자들에게 신발 아이템을 주려고 계획 중이에요. 이 경우 신발 아이템을 주기 위해서는 새로운 함수를 만들어야 한다는 거죠. 만약 앞선 함수를 active_user_list()
와 balloon_giveaway()
함수로 만든다면 추후에도 함수의 재활용이 가능할 거에요. 신발 아이템을 주기 위해서는 active_user_list()
를 통해 접속 사용자 리스트를 뽑아내고 shoes_giveaway()
함수를 만들어 사용할 수 있겠죠. 함수는 부품과도 같다는 걸 기억하세요! 부품이 서로 합쳐져 있다면 다양한 상황에서 사용하기가 힘들답니다.
매개변수의 자리에 실제로 입력되는 값은 '인수'라고 합니다. 매개변수는 말 그대로 값을 받는 역할만 하기 때문에 실제 값을 지칭하지는 않습니다!
모든 함수가 반환값을 가지지는 않습니다. 앞서 함수의 형태를 보여드릴 때 return
이 수행문 뒤에 적혀있지 않은 이유도 이 때문입니다. 수행문만 실행되고 반환값이 없는 함수도 존재한다는 거죠. return
이 존재한다고 해도, 뒤에 오는 값- 즉 반환값이 수행문의 결과를 반드시 반영하는 것도 아닙니다. 아래 예시를 살펴볼까요?
def square (x):
y = x**2
return x
square(5) #출력값은 5
수행문은 분명 매개변수 x
값의 제곱값을 만들어내고 있지만, 함수에 인수 5를 입력하니 출력값으로 5가 나옵니다. 이는 당연하게도 return
뒤에 오는 값이 y
가 아닌 x
, 입력값 그 자체이기 때문이죠. 이처럼 함수의 수행문 내용과 반환값이 전혀 관련이 없이 함수를 만들 수도 있다는 점을 기억합시다!