함수 — 프로그램을 업무 단위로 나누기
복잡해진 코드를 "기능별 블록(def)"으로 나누고 조립하는 방법을 배웁니다.
데이터를 받아(매개변수) 처리한 뒤, 결과를 돌려주는(return) 프로그램 설계의 핵심입니다.
학습 목표
- 함수의 필요성을 이해한다.
def를 이용해 함수를 만들고(정의), 호출할 수 있다.- 매개변수(parameter)로 데이터를 전달할 수 있다.
- 반환값(return)을 사용해 계산 결과를 돌려받을 수 있다.
- 기본값 매개변수와 지역변수/전역변수의 개념을 이해한다.
- 실제 업무 프로그램 코드를 함수 단위로 깔끔하게 리팩토링(재설계) 할 수 있다.
함수란? (구조와 호출)
함수(Function)는 반복해서 사용하는 코드를 하나의 기능으로 묶어 이름을 붙이는 것입니다.
def hello(): print("안녕하세요.") print("파이썬 공부를 시작합니다.")
만들기만 해서는 실행되지 않습니다.
hello() hello()
이름을 부르면 내부 코드가 실행됩니다.
언제든 재사용할 수 있습니다.
매개변수 (데이터 전달)
함수가 일하게 하려면 재료(데이터)를 넘겨주어야 합니다. 이를 매개변수(parameter)라고 합니다.
def add(a, b): print(a + b) # 호출할 때 값 2개를 전달 add(10, 20) # a=10, b=20 이 됩니다.
30
반환값 return (가장 중요한 개념)
return은 함수가 계산한 결과를 호출한 곳으로 돌려주는 역할을 합니다.
def calculate_tax(amount): return amount * 0.1 # 계산된 결과를 tax 변수에 저장할 수 있습니다. supply = 10000000 tax = calculate_tax(supply) print(f"부가세: {tax:,.0f}원")
파이썬은 콤마(,)를 사용해 여러 값을 동시에 반환할 수 있습니다.
# 받을 때도 두 변수로 받습니다.
tax, total = calculate_total(10000000)
print() 와 return 의 차이 (초보자 주의!)
초보자가 가장 많이 헷갈리는 부분입니다. 업무 자동화에서는 화면에 보여주는 print보다, 결과 데이터를 다음 코드에 넘겨주는 return이 훨씬 중요합니다.
def add(a, b): print(a + b) result = add(10, 20) # result에는 값이 없습니다 (None). # 다음 계산에 쓸 수 없습니다.
def add(a, b): return a + b result = add(10, 20) # result에 30이 저장됩니다. # 이 값으로 다음 계산을 할 수 있습니다.
함수 + 조건/반복문 결합
함수 안에 if문이나 for문을 넣어 업무 규칙을 통째로 묶을 수 있습니다.
def get_customer_grade(amount): if amount >= 50000000: return "A" elif amount >= 10000000: return "B" else: return "C" grade = get_customer_grade(25000000) print(grade) # B 출력
파이썬 내장 함수 (sum, max, min)
우리가 직접 def로 만들지 않아도, 파이썬이 통계 분석용으로 미리 만들어둔 강력한 함수들이 있습니다.
amounts = [1000000, 5000000, 3000000] print(sum(amounts)) # 9000000 (합계) print(max(amounts)) # 5000000 (최댓값) print(min(amounts)) # 1000000 (최솟값) print(sum(amounts) / len(amounts)) # 3000000 (평균)
기본값 매개변수와 키워드 인수
매개변수에 미리 기본값을 지정해두면, 값을 넘기지 않아도 에러 없이 기본값으로 작동합니다.
def calculate_tax(amount, rate=0.1): return amount * rate # 1. rate를 안 넘기면 기본값 10% 적용 print(calculate_tax(10000000)) # 1000000 # 2. rate를 넘기면 넘긴 값(20%) 적용 print(calculate_tax(10000000, 0.2)) # 2000000 # 3. 키워드 인수 (이름을 지정해서 넘기면 가독성 상승) print(calculate_tax(amount=10000000, rate=0.1))
지역변수(Local)와 전역변수(Global)
함수 안에서 만든 변수는 지역변수이므로, 함수가 끝나면 메모리에서 사라져 밖에서 쓸 수 없습니다.
value = 100
test()
print(value) # 에러 발생! value는 함수 안에서만 살아있습니다.
해결책: 데이터를 함수에 넘길 때는 매개변수를 쓰고, 결과를 받을 때는 return을 쓰면 완벽하게 해결됩니다.
실습 — 5단계 거래처 관리 리팩토링
5단계에서 만든 코드는 모든 로직이 while문 안에 섞여 있었습니다. 이를 함수로 분리하여 메인 로직을 단순화(설계) 해보겠습니다.
add_customer()거래처 등록
show_customers()거래처 목록
search_customer()거래처 검색
calculate_total()통계 계산
# 함수 정의 부분 생략 (add_customer, show_customers 등) customers = [] while True: print("1. 등록 | 2. 목록 | 3. 검색 | 4. 종료") menu = input("선택: ") if menu == "1": add_customer(customers) # ⬅ 함수 호출로 대체! elif menu == "2": show_customers(customers) elif menu == "3": search_customer(customers) elif menu == "4": break
코드의 가독성이 비약적으로 상승하며, 오류가 났을 때 해당 함수만 찾아가면 되므로 유지보수가 매우 쉬워집니다.
종합 실습 — 회계 거래 분석 프로그램
회계 로직을 함수로 추상화하는 가장 좋은 예시입니다.
# 1. 업무 규칙을 함수로 정의 (도구 만들기) def calculate_vat(amount): return amount * 0.1 def get_review_grade(amount): if amount >= 50000000: return "고액검토" elif amount >= 10000000: return "중요검토" else: return "일반" # 2. 데이터 준비 transactions = [ {"customer": "ABC상사", "amount": 5000000}, {"customer": "GHI상사", "amount": 80000000} ] # 3. 데이터 처리 (만들어둔 함수 호출) for t in transactions: amt = t["amount"] vat = calculate_vat(amt) grade = get_review_grade(amt) print(f"{t['customer']} | 부가세: {vat:,.0f} | 등급: {grade}")
1~6단계 핵심 요약 및 패러다임의 변화
1단계부터 5단계까지는 "파이썬 문법을 어떻게 사용하는가?"를 배웠다면,
6단계부터는 "프로그램을 어떻게 설계하는가?"로 관점이 변합니다.
def func()
func(data)
return result
과제 & 다음 단계 예고
add(a, b), subtract(a, b), multiply(a, b), divide(a, b) 함수를 각각 만들고, 두 숫자를 넘겨 `return`으로 계산 결과를 돌려받아 보세요.
본문의 종합 실습을 참고하여 거래자료 등록, 목록 조회, 합계, 부가세 계산 등을 모두 개별 함수로 쪼개고 while True: 로 메뉴를 만들어 동작시켜 보세요.
지금까지 우리가 입력한 수십 개의 거래처 데이터는 프로그램이 꺼지면(재실행하면) 모두 날아갑니다. 메모리에만 저장했기 때문입니다.
다음 7단계에서는 드디어 파일 열기/쓰기/읽기(CSV, 텍스트)를 배웁니다.
파이썬이 엑셀 파일을 읽어와 분석하고 결과를 새 파일로 저장하는 진정한 실무 자동화의 시작입니다.