티스토리 뷰

앞에서 봤던 이미지를 다시 한 번 보겠습니다.

함수에는 전달값, 동작, 반환값이라는 3 가지 요소가 있다고 말씀드렸는데요. open_account() 함수에는 전달값과 반환값이 사용되지 않고 동작만 정의되었습니다. 사실 이 둘은 옵션이라서 전달값 또는 반환값이 있는 함수도 있고 없는 함수도 있습니다. 물론 이 옵션이 있다면 반드시 필요한 이유가 있겠지요? 그럼 이번에는 전달값과 반환값을 포함하는 함수를 만들어보겠습니다.

 

우선 전달값과 반환값이 있는 함수는 이런 형태로 생겼으며, 함수 이름 옆의 괄호() 에는 필요한 갯수 만큼의 전달값이 들어가며, 함수 내에서는 이 전달값들을 활용한 어떤 명령을 수행하고 나서 맨 아래에 있는 return 을 통해서 값을 반환해줍니다. 전달값과 마찬가지로 반환값 또한 2개 이상이 될 수도 있습니다.

def 함수이름(전달값1, 전달값2, ...):
    실행 명령문1
    실행 명령문2
    ....
    return 반환값1, 반환값2, ...

 

은행 계좌를 만들었으니 이번에는 처음으로 입금을 한 번 해보겠습니다. deposit 이라는 함수를 만들고 2개의 값을 전달해볼텐데 첫 번째 값은 현재 잔액을 의미하는 balance, 두 번째 값은 입금하려는 금액을 의미하는 money 라고 이름을 적겠습니다. 이 이름들은 함수 내에서 변수처럼 사용됩니다. 함수 동작으로는 입금 완료를 안내하는 문구와 함께 현재 잔액 정보를 출력하고 나서 잔액 정보를 return 을 통해 반환해줍니다. 그러면 함수를 호출하는 곳에서는 반환값을 받아서 변수에 저장할 수 있게 됩니다. 

def deposit(balance, money): # 입금
    print("입금이 완료되었습니다. 잔액은 {0} 원입니다.".format(balance + money))
    return balance + money # 입금 후 잔액 정보 반환
    
balance = 0 # 최초 잔액
balance = deposit(balance, 1000) # 1000원 입금
print(balance) # 현재 잔액

이 때, 1000원을 입금하는 부분인 deposit(balance, 1000) 에서의 balance 는 바로 윗줄에 선언된 잔액 정보를 가지는 변수이며, 1000 이 입금액이 됩니다. 즉, deposit 함수를 호출하는데 0 과 1000 이라는 2개의 값을 전달하는 셈이죠.

 

잠깐!
함수를 정의할 때 전달값을 받기 위해 사용되는 balance, money 와 같은 변수를 매개변수(parameter) 라고 부르기도 합니다.

 

그리고 함수 정의부분에 있는 deposit(balance, money) 에서의 balance 는 함수 내에서 사용할 변수 이름이 되는데 호출할 때 사용된 balance 와 똑같은 이름이 사용되기는 했지만 둘은 사실 같은 변수는 아닙니다. 그저 처음 전달받은 값인 0 을 저장하는 새로운 변수일 뿐이죠. money 또한 1000 이라는 값을 저장하는 새로운 변수가 되며 이 둘은 함수 내에서만 사용할 수 있게 됩니다.

 

함수 내의 동작이 완료되고 나서 마지막으로 return balance + money 를 통해 값을 반환해주는데, 이렇게 반환해주는값은 함수 밖에 정의된 balance 함수에 저장이 됩니다. 마치 변수에 어떤 값을 저장하는 것처럼, 함수를 호출하고 나서 반환해주는 값을 저장하게 되는 것이죠.

balance = 0 # balance 변수에 0 이라는 값을 저장
balance = deposit(balance, 1000) # balance 변수에 deposit() 함수의 반환값을 저장

 

만약 앞에 balance = 란 부분이 없다면 어떻게 될까요?

deposit(balance, 1000)

함수는 어떤 값을 반환해주기는 하는데 아무 변수도 지정하지 않았으므로 그 값은 어디에서도 사용할 수 없게 됩니다. 그렇기 때문에 반환값이 있는 함수를 이용하며 반환값을 사용하고자 할 때에는 반드시 값을 반환 받을 변수를 명시해야 합니다.

 

잠깐!
함수 내에서 return 부분이 실행되고 나면 값을 반환함과 동시에 함수는 탈출하게 됩니다. 그러므로 return 밑에 어떤 코드가 있다면 이 부분은 실행되지 않는다는 점 주의해주세요. 마치 반복문을 탈출하게 해주는 break 와 비슷하다고 이해하시면 됩니다.

 

이번에는 출금하는 함수를 만들어보겠습니다. 출금의 경우에는 출금하려는 금액이 현재 계좌의 잔액보다 같거나 많아야만 가능할테니 if 조건을 통해서 금액 비교를 해야겠네요.

def withdraw(balance, money): # 출금
    if balance >= money: # 잔액이 출금보다 많으면
        print("출금이 완료되었습니다. 잔액은 {0} 원입니다.".format(balance - money))
        return balance - money # 출금 후 잔액 반환
    else:
        print("출금이 완료되지 않았습니다. 잔액은 {0} 원입니다.".format(balance))
        return balance # 기존 잔액 반환
        
balance = 0 # 최초 잔액
balance = deposit(balance, 1000) # 1000원 입금

# 출금 시도
balance = withdraw(balance, 2000) # 2000원 출금 시도 시 잔액이 부족하므로 실패
balance = withdraw(balance, 500) # 500원 출금 시도 시 성공
print(balance) # 현재 잔액

코드에서는 2번에 걸쳐서 출금을 시도합니다. deposit() 함수를 호출한 후에는 잔액이 1,000원인데 처음 출금을 시도할 때는 2,000 원을 전달값으로 넘기네요. 이 때는 잔액이 출금하려는 금액보다 적으므로 실패를 하게 됩니다. 두 번째는 출금액을 500원으로 지정하며 이 때는 잔액이 더 많기 때문에 정상적으로 출금이 이루어지고 출금 후 잔액도 올바르게 반환되는 것을 볼 수 있습니다.

 

실행 결과는 이렇습니다.

입금이 완료되었습니다. 잔액은 1000 원입니다.
출금이 완료되지 않았습니다. 잔액은 1000 원입니다.
출금이 완료되었습니다. 잔액은 500 원입니다.
500

 

이번에는 저녁에 출금을 한다고 가정해보겠습니다. 은행 업무 시간이 아닌 경우에는 수수료를 지불해야 하는데 수수료는 100원이라고 하겠습니다. 코드를 간편하게 하기 위해서 편의상 함수 내에서 금액 비교하는 부분은 제외하고, 항상 잔액보다는 적은 금액을 출금한다고 할게요. 그리고 이번에는 출금 후 잔액 뿐 아니라 수수료도 얼마였는지 확인할 수 있도록 둘을 함께 반환해주는 것으로 코드를 작성해보겠습니다.

def withdraw_night(balance, money): # 저녁에 출금
    commission = 100 # 출금 수수료 100원
    return commission, balance - money - commission # 튜플 형식으로 반환
    
balance = 0 # 최초 잔액
balance = deposit(balance, 1000) # 1000원 입금

# 저녁에 출금 시도
commission, balance = withdraw_night(balance, 500)
print("수수료 {0} 원이며, 잔액은 {1} 원입니다.".format(commission, balance))

 

실행 결과를 먼저 볼까요?

입금이 완료되었습니다. 잔액은 1000 원입니다.
수수료 100 원이며, 잔액은 400 원입니다.

 

1,000원이 입금된 상태에서 500원을 출금해보니, 수수료 100원을 제외한 400원이 잔액이라며 올바르게 표시가 됩니다. 이 때 return 부분을 살펴보면 수수료를 저장하고 있는 commission 과 출금 후 잔액인 balance - money - commission (기존 잔액에서 출금액과 수수료를 뺀 금액) 을 콤마로 구분하여 함께 적었죠?

 

그렇습니다. 바로 튜플 형태인데요. 콤마로 구분하여 2개 이상의 값을 적으면 함수를 호출하는 쪽에서도 콤마로 구분된 여러 개의 변수에 값을 한 번에 저장할 수 있게 됩니다. 예제에서는 좌항의 commission 과 balance 에 각각 수수료와 잔액 정보를 저장하고 있네요.

commission, balance = withdraw_night(balance, 500) # 튜플 형식으로 반환된 2개의 값을 각 변수에 저장

 

잘 기억이 안나신다구요?

앞에서 튜플을 공부하며 다뤘던 예제는 이겁니다. 괄호만 제외하면 비슷하게 생겼죠?

(name, age, hobby) = ("김종국", 20, "코딩")
print(name, age, hobby) # 김종국 20 코딩

 

참고로 이 예제에서 좌항과 우항의 괄호는 있거나 없거나 결과는 동일합니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함