본문 바로가기
Python/Python Basic

15. Python - Python 함수 사용 이유, 선언 및 호출

by Rosmary 2020. 2. 7.
728x90
반응형

Python으로 어떤 절차를 고스란히 수행하는 프로그램을 만든다고 가정해보자. 예를 들면, "강아지의 하루"라는 이름의 게임을 제작한다던지 말이다. 

 

강아지가 아침에 일어난다. 일어나는 과정을 나열하면 다음과 같을 것이다.

 

<일어나는 과정>

1. 아침이 밝았다.

2. 햇살이 강아지를 비춘다.

3. 강아지가 밝아진 주변을 인식하고 눈을 뜬다.

4. 기지개를 편다.

 

일어나보니, 배가 고프다. 밥을 먹는 과정은 아래와 같을 것이다.

 

<밥을 먹고 싶다>

1. 밥 주는 놈이 자고 있는가?

    1-1. Yes: 침대위로 올라가 이놈의 뺨을 사정없이 핥핥(?)하는 동시에 "왈왈" 짖는다.

    1-2. No : 이놈을 빤히 쳐다본다. 이놈이 나의 배고픔을 인지했는가?

       1-2-1. Yes: 이놈이 밥을 준다.

       1-2-2. No: 이놈을 보고 입을 열어 왈왈 짖으면서 밥을 달라고 보챈다.

       1-2-3. No: 이놈이 나보고 밥 많이 먹는다고 구박한다. 화가 나서 입을 열어 왈왈 짖는다.

 

아마 산책가는 과정도 비슷할 것이다.

 

<산책을 가고 싶다>

1. 밖에 가고 싶다.

2. 날씨가 좋은가?

   2-1. 그런거 상관없다. 밖에 가자고 저놈을 빤히 쳐다본다. 저놈이 나의 마음을 읽었는가?

      2-1-1. Yes: 저놈이 나갈 채비를 한다. 빨리 서두르라고 입을 열고 왈왈 짖으며 보챈다.

      2-1-2. No:  저놈이 귀찮은가보다. 목줄을 물어와 툭 떨궈놓은 뒤, 입을 열고 왈왈 짖으며 나가자고 어필해본다.

 

뭐... 이런식으로 말이다.

필자의 스토리 상에 유독 강아지가 "왈왈" 짖는 부분이 많이 나오는데, 이 과정을 조금 더 나누어 작성하면 다음과 같을 것이다.

 

1. 입을 연다.

2. 목소리를 내며 "왈왈" 짖는다.

 

...자, 이제 이 시나리오를 코드로 작성한다고 해보자. <밥을 먹고 싶다>와 <산책을 가고 싶다> 부분에서, "왈왈"거리는 부분이 4번이나 나오는데, 이 부분에 모두 <짖는 과정> 6단계에 대한 내용을 일일이 기입하면, 시간 낭비도 낭비거니와 오타로 인해 코드가 오작동하는 경우도 발생할 수 있다. 예를 들어, <밥을 먹고 싶다>에서 1-2-2의 왈왈 거리는 부분이

 

1. 입을 연다.

2. 목소리를 내며 "왈왈" 짖는다

 

로 제대로 작성되어 있더라도, 나머지에서 

 

1. 콧구멍을 연다.

2. 목소리를 내며 "왈왈" 짖는다

 

로 작성된다면...이 강아지는 1-2-2의 상황을 제외하고 코로 왈왈 거리는 웃지 못할 상황이 발생한다는 말이다. 이를 방지하기 위해서, 일정한 행동 양식들을 하나의 행위로 묶어버린다면, 강아지를 코드로 구현하는 것이 어렵지 않을 것이다.

 

<짖는 행위>

1. 입을 연다.

2. 목소리를 내어 "왈왈 짖는다.

 

이제 짖는 행위를 위에서 나열한 시나리오에 넣어보면 다음과 같이 된다. 

 

<밥을 먹고 싶다>

.....

       1-2-2. No: 이놈을 보고 <짖는 행위> 밥을 달라고 보챈다.

       1-2-3. No: 이놈이 나보고 밥 많이 먹는다고 구박한다. 화가 나서 <짖는 행위>.

 

<산책을 가고 싶다>

.....

      2-1-1. Yes: 저놈이 나갈 채비를 한다. 빨리 서두르라고 <짖는 행위> 보챈다.

      2-1-2. No:  저놈이 귀찮은가보다. 목줄을 물어와 툭 떨궈놓은 뒤, <짖는 행위> 나가자고 어필해본다.

    

전체적으로 시나리오 자체가 간결해진 느낌이다. 시나리오 코드 타이핑 시간도 줄어드는 것은 물론, 이제 더 이상 강아지가 코로 "왈왈" 짖는 상황은 발생하지 않는다. 

 

프로그래밍에서도 이러한 상황이 많이 발생한다. 일련의 행위를 수행하는 코드가 반복적으로 나타날 경우(입을 열고, "왈왈"짖는), 아무래도 코드줄이 기하급수적으로 늘어나 관리에 어려움이 있는데, 해당 코드를 하나의 함수(<짖는 행위>)로 선언하면 이러한 문제가 어느정도 해결된다. 

 

나름대로 스토리를 통해 설명하려고 했는데... 잘 전달되었는지 모르겠다. 본격적으로 파이썬 코드를 통해 함수 사용 방법을 알아보자.

 

 

1. 함수 선언

 

Python을 위시한 대부분의 프로그래밍 언어는, 변수를 사용하기 위해 미리 그 변수를 선언하는 과정이 필요하다. 그렇지 않다면, 코드에서 나타난 변수를 컴퓨터가 해석하지 못하고 에러를 출력하기 때문이다.

 

 

함수도 변수와 마찬가지로, 사용하기 전에 선언이 되어야 한다. 함수의 선언은 다음과 같은 포맷으로 진행한다.

 

----------------------------------------

def 함수명(   ) :

    함수 내에서 작동할 코드

----------------------------------------

 

만약, 코드에서 "hello"라는 문구를 출력하는 "greeting"이라는 이름의 함수를 만든다고 해보자. 다음과 같은 과정을 통해 함수를 선언하게 된다.

 

 

2. 함수 호출

 

하지만, 함수의 선언만으로는 "hello"라는 문구가 어디에서도 출력되지 않는다. 이 문구를 출력하기 위해서, 우리는 함수를 호출해주어야 한다. 함수의 호출 방법은 매우 간단하다. 단순히 함수명과 괄호()만 입력해주면 된다.

 

 

그런데 이거... 어디서 많이 보던 형식 아닌가? 지금까지 필자가 Python 관련된 포스팅을 하면서 미친듯이 사용해왔던 print(), input(), int() 등등의 함수들이 모두 이런 형태다. 지금 만든 함수와는 약간 차이가 있는데, 비교해보면 아래와 같다.

 

 

(1) print나 input은 함수의 선언이 없다.

지금까지 숱하게 사용한 print나 input과 같은 함수는 Python에 기본적으로 내장된 함수들이다. 따라서 별도의 선언 없이도 이 함수들을 호출하는데에 문제가 없다.

 

(2) 새로 만든 greeting 함수는 괄호 내에 추가되는 값이 없다.

print()나 input() 함수는 괄호 안에 추가되는 값이 있거나 없어도 동작이 된다. 하지만, 우리가 만든 greeting() 함수는, 괄호 내에 특정 값을 넣게되면 아래와 같이 에러가 발생한다.

 

 

에러 출력물을 확인하면 알 수 있겠지만, 함수의 선언 과정에서 괄호 안에 인자가 선언되지 않았기 때문에, greeting("hello")라는 함수 호출 문구를 컴퓨터가 이해하지 못한 것이다. 만약 함수 선언을 다음과 같이 수정한다면, 에러는 발생하지 않는다.

 

 

이번 포스팅에서는 함수를 사용하는 이유에 대한 이상한 예시와 더불어, 함수의 선언과 호출에 대해 정말 간략하게만 살펴보았다. 다음 포스팅에서는 함수의 종류를 나름대로 구분하여 설명함과 동시에, 바로 직전에 언급했던 인자의 사용에 대해서도 설명을 진행하려 한다.

 

FIN.

반응형

댓글