2.9 함수
2.9.1 기본
우리가 수학 시간에 배운 함수란 특정 값을 전달하면 그 값을 가지고 계산한 결과를 얻었습니다. 프로그래밍에서 말하는 함수도 이와 크게 다르지 않습니다. 수행하고자 하는 함수 로직을 정의하고 값을 전달해서 사용하면 됩니다. 하지만 지금까지는 함수를 정의한 적 없이 쓰기만 해 왔습니다. print()가 그것입니다. print() 함수 내부가 어떻게 되어 있는지는 모르지만, 출력하고 싶은 값을 전달하거나 변수를 전달하면 출력부에 출력하는 역할을 수행했습니다.
print(출력하고 싶은 값 또는 변수)
이렇게 사용자가 정의하지 않고도 파이썬에서 기본적으로 사용할 수 있도록 정의해 놓은 함수들을 내장 함수(builtin functions)라고 합니다. 하지만 사용자가 직접 함수를 만들고자 한다면 다음 문법을 사용해야 합니다.
def 함수명(매개변수1, 매개변수2, 매개변수3, …):
함수로직
파이썬에서 함수를 정의할 때는 def라는 키워드를 쓴 다음 한 칸 띄고(Spacebar 이용) 함수명과 함수로 전달할 매개변수(parameter)를 만듭니다. 그다음 줄부터는 함수를 실행할 때 수행할 로직이 들어갑니다. 그럼 사용자에게서 입력 값을 두 개 받아 둘을 더한 값을 출력하는 함수를 만들어 보겠습니다.
def add(param1, param2):
print(param1 + param2)
add라는 이름의 함수를 만들어 param1과 param2의 두 값을 더한 결과를 출력하는 함수를 만들었습니다. 이제 우리가 만든 함수를 사용해 보겠습니다.
> add(1, 3)
4
함수를 정의할 때 사용한 param1 자리에는 1이 전달되고 param2 자리에는 3이 전달되어 4라는 결과가 출력되었음을 알 수 있습니다. 이를 그림으로 표현하면 다음과 같습니다.
▲ 그림 2-20 함수
그럼 함수의 사용법을 좀 더 자세히 살펴보겠습니다.
➊ 함수를 정의하기 전에 먼저 사용하려고 하면 에러가 발생합니다.
> add(1, 3)
> def add(param1, param2):
> print(param1 + param2)
(...)
NameError: name 'add' is not defined
add 함수가 정의되기 전에 add(1, 3)을 사용하면 add 함수 밑에 빨간색 밑줄이 나타나 에러가 발생했다는 것을 알 수 있습니다.
➋ 함수를 정의만 하고 사용하지 않으면 함수에 만들어 둔 기능이 동작하지 않습니다. 함수를 호출하려면 다음과 같이 def를 빼고 함수명과 함께 매개변수에 전달할 값을 입력합니다.
> def add(param1, param2):
> print(param1 + param2)
>
> add(1, 3)
4
➌ 함수에 전달하는 매개변수명과 개수는 자유롭게 정할 수 있지만 함수를 호출할 때는 정의된 그대로 사용해야 합니다. 다음과 같이 add 함수를 정의하는 부분에는 매개변수를 하나만 정의하고, 함수를 사용할 때는 매개변수를 두 개 사용하면 에러가 발생합니다.
> def add(param1):
> print(param1)
> add(1, 3)
(...)
TypeError: add() takes 1 positional argument but 2 were given
➍ 매개변수를 아예 정의하지 않고 사용할 수도 있지만, 이 경우 굳이 함수를 만들어야 하는지 판단할 필요가 있습니다.
> def print_hello():
> print("Hello")
> print_hello()
Hello
이 함수는 다음과 같이 print("Hello")만 사용할 때와 똑같은 결과를 출력합니다. 같은 코드를 더 길게 사용할 필요는 없겠죠? 그렇지만 매개변수가 없는 함수가 꼭 불필요한 함수라는 의미는 아닙니다. 다만 프로그래밍을 처음 접한 사람이 매개변수를 사용하지 않는 함수를 정의할 때는 사용 목적과 쓰임새를 고민할 필요가 있다는 점을 전하고 싶었습니다.
> print("Hello")
Hello