[바로바로 파이썬 07] 함수의 개념 알아보기
이번 장에서는 프로그래밍의 핵심 도구인 함수를 공부합니다. 사실 여러분은 print( )처럼 파이썬에서 제공하는 함수를 계속 써왔으니 함수와 이미 구면입니다. 이제 직접 함수를 만들어볼 차례입니다.
함수는 프로그래밍 세계에서 꼭 알아야 하는 개념 중 하나입니다. 우리가 프로그램을 만드는 이유는 결국 어떤 문제나 불편함을 해결하기 위해서입니다.
‘내 불편함을 해결해주는 프로그램을 만들고 싶다.’그런데 실제로 문제를 해결하는 프로그램을 만들다 보면 같은 작업을 반복해서 수행해야 하는 경우가 많습니다. 예를 들어 매일 똑같은 데이터를 정리하거나, 같은 계산을 여러 번 해야 할 때가 있죠. 이때 함수를 사용하면 반복되는 작업을 한 번만 정의해두고 필요할 때마다 꺼내 쓸 수 있습니다. 즉, 함수는 여러분이 만들고 싶은 프로그램을 효율적으로 만들 수 있게 해주는 핵심 도구입니다. 여기에는 프로그래밍의 중요한 원칙이 하나 담겨 있습니다. 같은 코드가 여러 곳에 반복해서 등장한다면 하나로 묶어 재사용할 방법을 생각해보는 것이 좋습니다. 똑같은 코드를 여러 곳에 복사해두면 나중에 코드를 수정할 때마다 모든 곳을 찾아 고쳐야 하지만, 함수로 묶어두면 그 함수의 코드만 수정하면 되기 때문입니다. 그럼 함수의 개념부터 알아봅시다.
함수 개념 있는 그대로 이해해보기
보통 함수를 설명할 때 믹서기와 같은 기계에 비유하곤 합니다. 하지만 처음부터 비유로 접근하면 오히려 함수의 개념을 이해하기 어려울 수도 있습니다. 그래서 여기서는 먼저 파이썬의 함수를 있는 그대로 살펴본 뒤, 함수가 왜 기계에 자주 비유되는지도 알아보겠습니다. 함수의 개념은 다음과 같이 정리할 수 있습니다.• 특정 작업을 수행하는 코드 블록에 이름을 붙여 필요할 때마다 호출하여 사용할 수 있도록 만든 것정리하면 특정 작업을 수행하는 코드 블록에 이름을 붙인 것이 함수이고, 필요할 때마다 호출하여 사용할 수 있다는 것이 함수의 특징입니다.
다음 코드는 greet이라는 이름의 함수를 정의한 것입니다. 함수를 만드는 것을 함수를 정의한다라고 합니다.
이처럼 함수는 만들어두기만 하고 아직 실행하지 않는 것이므로, 무엇을 할지 미리 정해둔다는 뜻에서 정의한다고 합니다. 인터프리터 셸에서는 함수의 마지막 줄을 입력한 뒤 빈 줄에서 Enter 를 한 번 더 누르면 정의가 완료됩니다. 코드를 작성하고 실행해도 화면에는 아무것도 출력되지 않습니다. 지금은 함수를 정의했을 뿐, 함수를 호출하지 않았기 때문입니다. 앞에서 정리한 함수의 개념을 다시 떠올려봅시다.
정의한 함수의 코드 블록을 실행하려면 함수를 호출해야 합니다.
이제 함수를 호출해봅시다. greet( ) 함수를 호출하는 방법은 지금까지 print( )와 같은 함수를 사용했던 방법과 같습니다. 다음과 같이 작성하고 실행하면 됩니다.
함수를 호출하면 함수 안에 들여쓰기로 작성해둔 코드 블록이 실행됩니다. 앞으로 같은 인사말을 출력하고 싶을 때는 greet( ) 함수를 호출하기만 하면 되겠네요.
함수의 구성 요소 살펴보기
이제 함수가 무엇인지 어느 정도 감이 잡힐 겁니다. 함수를 정의하고 호출하는 방법도 알아봤습니다. 그럼 앞에서 greet( ) 함수를 정의할 때 작성했던 코드를 다시 살펴보면서 함수의 구조를 파악하겠습니다. 함수는 크게 윗부분과 아랫부분으로 나눌 수 있습니다. 이를 각각 함수 헤더와 함수 본문이라고 합니다. 용어 자체가 중요한 것은 아니니 머리와 몸통 같은 관계라고 생각하면 됩니다.
함수 헤더는 함수의 머리와 같은 역할을 합니다. 함수의 시작을 알리고, 이름이나 함수에 필요한 매개변수 등을 함수 헤더에 작성합니다. 함수 헤더는 다음과 같이 크게 네 부분으로 구성됩니다. 하나씩 알아봅시다.
➊ defdef는 함수를 정의할 때 사용하는 키워드로, 함수를 직접 정의하려면 def로 시작합니다. def는 파이썬에서 정해진 키워드이므로 다른 것으로 바꿀 수 없습니다.
➋ 함수 이름def 다음에 한 칸을 띄고 함수 이름을 작성합니다. 함수 이름은 파이썬의 식별자 규칙에 맞게 지어야 합니다. 다음 규칙을 살펴봅시다.
1. 영문자뿐만 아니라 한글과 같은 유니코드 문자, 숫자, 언더스코어(_) 등을 사용할 수 있습니다. 다만 공백이나 @, #, % 같은 특수문자는 사용할 수 없습니다.
2. 숫자로 시작할 수 없습니다. a. def 1function( ): → X
3. 예약어나 키워드는 함수 이름으로 사용할 수 없습니다. a. def if( ): → X b. def for( ): → X c. def return( ): → X
4. 대소문자를 구분합니다. a. myFunction( )과 myfunction( )은 서로 다른 함수입니다.
이러한 규칙을 지키지 않으면 오류가 발생합니다. 인터프리터 셸에서 함수 이름 규칙에 어긋나는 코드를 직접 작성해 확인해보겠습니다.
오류가 발생했습니다. 오류가 발생한 위치는 ^ 기호로 표시하며, 숫자가 있는 위치를 가리키고 있습니다. 오류 메시지를 해석해보면 ‘잘못된 10진수 리터럴’이라는 뜻입니다. 함수 이름은 숫자로 시작할 수 없는데 숫자로 시작했기 때문에 문법 오류가 발생한 것입니다. 이처럼 함수 이름은 자유롭게 지을 수 있지만 앞에서 살펴본 규칙은 지켜야 합니다.
➌ 소괄호와 매개변수함수를 정의할 때 함수 이름 뒤에 소괄호를 붙입니다. 또한 이 소괄호 안에 매개변수를 작성하여 함수가 값을 전달받을 수 있게 합니다. 앞에서 작성한 greet( ) 함수는 소괄호가 비어 있으므로 매개변수가 없습니다.
매개변수란 함수를 호출할 때 전달받은 값을 함수 안에서 사용하기 위해 함수를 정의할 때 만들어두는 변수입니다. 좀 더 쉽게 말하면 ‘나중에 어떤 값이 들어올지는 모르지만, 일단 값을 받아 함수 안에서 사용해야지’라고 생각할 때 만들어두는 변수라고 할 수 있습니다. 예를 들어 greet( ) 함수가 사람 이름을 넣어 인사하도록 수정하고 싶다면 어떻게 해야 할까요? 우선은 다음과 같이 코드를 수정해볼 수 있습니다.
하지만 이렇게 함수를 작성하면 사람 이름이 바뀔 때마다 print( ) 함수가 있는 함수 본문을 직접 수정해야 합니다. 좀 더 편리한 방법이 없을까요? 매개변수를 사용하면 함수의 동작은 그대로 유지하면서, 호출할 때마다 달라지는 값만 전달하여 효율적으로 처리할 수 있습니다.
매개변수를 사용했다면 함수를 호출할 때 name에 전달할 값이 필요합니다. 이때 함수를 호출하면서 전달하는 값을 인수라고 합니다. 매개변수가 있는 함수는 다음과 같이 인수를 전달하여 호출할 수 있습니다.
이렇게 함수를 호출하면 "바로"라는 인수가 매개변수 name으로 전달되고, 함수 본문에서는 name을 통해 그 값을 사용할 수 있습니다. 이름 그대로 매개변수는 함수의 호출과 정의 사이에서 값을 전달받는 역할을 합니다. 이렇게 함수를 작성해두면 함수 본문을 수정하지 않고 호출할 때 전달하는 이름만 바꿔 사용할 수 있습니다.
➍ 콜론콜론(:)은 함수 헤더의 끝을 나타냅니다. 콜론 뒤에는 줄을 바꾸고 들여쓰기하여 함수 본문을 작성합니다.
파이썬에서는 같은 수준으로 들여쓰기하여 묶은 코드를 코드 블록이라고 합니다. 함수를 정의할 때 함수 헤더 아래에 들여쓰기하여 작성한 코드 블록을 함수 본문이라고 합니다. 함수가 호출되면 이 함수 본문의 코드가 실행됩니다.
이제 함수의 기본적인 개념은 어느 정도 익혔습니다. 하지만 함수에서 꼭 알아야 할 중요한 개념이 하나 더 있습니다. 바로 반환입니다. 지금까지는 함수가 코드를 실행하는 모습에 집중했다면, 이제 함수가 실행한 결과를 바깥으로 돌려주는 방법을 알아봅시다.
