06.1 함수의 개념 알아보기
윤혜민·박현규 · 28 / 30 절함수는 프로그래밍 세계에서 꼭 알아야 하는 개념 중 하나입니다. 함수의 개념을 이해하는 건 아주 중요한 일입니다. 왜냐하면 여러분이 프로그래밍 언어를 배운다는 건 다음 욕구가 있기 때문입니다.
‘뭔가 내 불편함을 해결해주는 프로그램을 만들고 싶다’
그런데 실제로 문제를 해결하는 프로그램을 만들려면 같은 작업을 반복해서 수행해야 하는 경우가 많습니다. 예를 들어 매일 똑같은 데이터 정리 작업을 하거나, 여러 번 같은 계산을 해야 할 때 말이죠. 이때 함수를 사용하면 반복되는 작업을 한 번만 정의해두고 필요할 때마다 꺼내 쓸 수 있습니다. 즉, 함수는 여러분이 만들고 싶은 프로그램을 효율적으로 만들 수 있게 해주는 핵심 도구입니다. 그럼 함수의 개념부터 알아봅시다.
함수 개념 있는 그대로 이해해보기
보통 함수를 설명할 때 믹서기와 같은 기계에 비유하여 설명하는 일이 많습니다. 그런데 그렇게 설명하면 오히려 빙빙 돌아가는 일이 많습니다. 그래서 저는 일단 파이썬의 함수를 있는 그대로 설명한 뒤 왜 그런 비유를 들어 설명하는지 이야기하겠습니다. 함수의 정의는 다음과 같습니다.
- 특정한 작업을 수행하는 코드 블록에 이름을 붙여서, 필요할 때마다 호출하여 사용할 수 있도록 만든 것
정리하자면 ➊ 특정한 작업을 하는 코드 블록에 이름을 붙인 것이 함수의 개념이고, ➋ 함수는 필요할 때마다 호출해서 사용할 수 있다라는 것이 함수의 특징이네요.
함수 정의해보기
다음 코드는 greet이라는 이름의 함수를 정의한 것입니다. 함수를 작성하는 것을 ‘함수를 정의한다’라고 합니다. 왜 그럴까요? 그 이유는 코드를 다 작성한 다음 이야기하겠습니다.
[Note] >>> 표시가 보이죠? 인터랙티브 셸에서 작성해보기 바랍니다.
```
>>> def greet():
>>> print("안녕하세요!")
>>> print("반갑습니다!")
>>> print("좋은 하루 되세요!")
```
코드를 작성하면 아무 일도 일어나지 않습니다. 왜냐하면 우리는 지금 함수를 정의한 것이지 함수를 호출하여 실행한 것이 아니기 때문입니다. 다시 함수의 개념으로 돌아가 문장을 읽어보기 바랍니다. 함수는 반드시 호출해서 사용해야 합니다.
함수 호출해보기
이제 함수를 호출해봅시다. greet( ) 함수를 호출하는 방법은 지금까지 우리가 함수를 호출한 방법과 같습니다. 다음과 같이 작성하고 실행하면 됩니다.
```
>>> greet( )
```
```실행 결과
안녕하세요!
반갑습니다!
좋은 하루 되세요!
```
함수를 호출하면 함수 내에 들여쓰기로 입력해두었던 코드 블록을 실행합니다. 앞으로 인사할 일이 있으면 greet( ) 함수를 호출하기만 하면 되겠네요.
함수의 구성 요소 살펴보기
이제 함수가 무엇인지 감이 잡힐 겁니다. 함수를 정의하고 호출하는 방법도 알았습니다. 그럼 앞에서 greet( ) 함수를 정의할 때 무작정 작성했던 코드를 다시 돌아보면서 함수의 구조를 파악하겠습니다. 함수는 크게 윗부분과 아랫부분으로 나눌 수 있습니다. 이를 특별히 함수 헤더와 함수 본문이라고 이름지어 부르는데 크게 중요하진 않습니다. 머리와 몸통 같은 관계라고 생각하면 됩니다.

함수 헤더
함수 헤더는 함수의 머리와 같은 역할을 합니다. 함수의 시작을 알리고 함수 이름이나 함수에 사용해야 하는 매개변수를 함수 헤더에 작성합니다. 함수 헤더는 크게 네 부분으로 구성됩니다. 하나씩 알아봅시다.

➊ def
def는 함수를 정의하기 위해 사용해야 하는 키워드입니다. 말 그대로 여러분이 함수를 만들고 싶다면 반드시 def로 시작해야 합니다. def는 키워드이므로 변경할 수 없습니다.
➋ 함수 이름
def 다음에 띄어쓰기로 구분하여 함수 이름을 작성합니다. 함수 이름은 마음대로 지을 수 있습니다. 단, 다음 규칙은 반드시 따라야 합니다.
영문자, 숫자, 언더스코어(_)만 사용할 수 있고, 특수문자(@, #, %, 공백 등)는 사용할 수 없습니다.
숫자로 시작할 수 없습니다.
1. ```def 1function(): ➝ X```
- 예약어나 키워드를 사용할 수 없습니다.
1. ```
2. def if(): ➝ X
3. def for(): ➝ X
4. def return(): ➝ X
5. ```
- 대소문자를 구분합니다.
1. myFunction( )과 myfunction( )은 서로 다른 함수
만약 이 규칙을 따르지 않으면 오류가 발생합니다. 인터렉티브 셸에서 함수 이름 규칙을 어겨 코드를 작성해보겠습니다.
```
>>> def 2function():
```
```실행 결과
File "<python-input-0>", line 1
def 2function():
^
SyntaxError: invalid decimal literal
```
오류가 발생했습니다. 오류 위치도 ^로 표시해줍니다. 숫자에 표시가 되어 있네요. 오류 메시지의 뜻을 풀어 해석해보면 ‘허용하지 않은 숫자값’이라는 뜻입니다. 함수 이름을 시작할 때 숫자를 사용하면 안 되는데 숫자를 사용했기 때문에 오류가 발생한 것입니다. 이처럼 함수 이름은 자유롭게 지어도 되지만 여기서 언급한 규칙은 지켜가며 지어야 합니다.
➌ 소괄호와 매개변수
소괄호는 함수의 매개변수를 정의하기 위한 것입니다. 지금 여러분이 작성한 greet( ) 함수는 소괄호가 비어있으므로 매개변수가 없습니다.

매개변수란 이름 그대로 함수를 호출할 때 어떤 값을 전달하고 싶을 때 사용하는 매개가 되는 변수를 말합니다. 좀 더 쉽게 말하자면 여러분이이 함수를 정의할 때 ‘어떤 값을 받을지는 모르지만 어쨌든 이녀석을 통해 값을 받아서 함수 내에서 사용해야지’라는 마음이 들 때 사용하는 것이 매개변수입니다. 예를 들어 greet( ) 함수가 사람 이름을 언급하면서 인사를 건네는 방식으로 수정하고 싶다면 어떻게 해야 할까요? 우선은 코드를 수정해서 이렇게 만들어볼 수 있습니다.
```
>>> def greet():
>>> print("안녕하세요! <span class="mark">요즘 님!</span>")
>>> print("반갑습니다!")
>>> print("좋은 하루 되세요!")
>>> greet( )
```
```실행 결과
안녕하세요! 요즘 님!
반갑습니다!
좋은 하루 되세요!
```
하지만 이렇게 함수를 작성하면 사람 이름이 바뀔 때마다 print( ) 함수의 본문을 수정해야 합니다. 좀 더 영리한 방법이 없을까요? 매개변수를 사용하면 함수 본문에서 일부만 바뀌면 되는 것들을 효율적으로 다룰 수 있습니다.
```
>>> def greet(name):
>>> print(f"안녕하세요! <span class="mark">{name} 님!</span>")
>>> print(f"반갑습니다!")
>>> print(f"좋은 하루 되세요!")
```
매개변수를 사용하려면 name에 어떤 값을 전달해야 합니다. 그 값을 인수라고 합니다. 매개변수가 있는 함수는 다음과 같이 인수를 전달하며 호출해야 합니다.
```
>>> greet(<span class="mark">"요즘"</span>)
```
```실행 결과
안녕하세요! 요즘 님!
반갑습니다!
좋은 하루 되세요!
```
이렇게 함수를 호출하면 “요즘”이라는 인수가 매개변수 name으로 전달이 되며, 함수 본문에서 사용한 name에 그대로 전달됩니다. 이름 그대로 매개변수는 이렇게 호출과 정의 사이에서 값을 매개하는 역할을 합니다. 이렇게 함수를 작성해두면 호출할 때 이름값만 바꿔서 사용할 수 있습니다.
>>> greet(<span class="mark">"셀레나"</span>)
안녕하세요! 셀레나 님!
반갑습니다!
좋은 하루 되세요!
➍ 콜론
콜론은 함수 이름과 매개변수 끝에 입력하는 일종의 맺음자입니다. 콜론 다음에는 함수 본문이 나온다는 걸 알리는 역할을 합니다.
함수 본문
파이썬에서 코드 작성 시 들여쓰기를 나란히 맞춰 작성한 부분을 코드 블록이라고 부른다고 했습니다. 그런 코드 블록 중에 함수 내에 있는 코드 블록을 특별히 함수 본문이라고 부릅니다. 함수 본문은 함수를 호출할 때만 실행됩니다.

함수의 개념은 이정도면 기초는 뗀 셈입니다. 하지만 함수의 핵심은 반환에 있습니다. 이제 함수 개념 공부를 마무리할 때입니다. 함수의 반환을 알아봅시다.
