콘텐츠로 건너뛰기

복잡한 코드를 한 줄로 줄이는 마법

12월 12, 2025
파이썬 함수 완벽 가이드 - def로 코드 재사용하고 복잡한 로직을 간단하게 만드는 방법

파이썬 함수(Function) 완벽 정리: 복잡한 코드를 한 줄로 줄이는 마법

여러분, 같은 코드를 10번, 20번 반복해서 작성해본 적 있나요? “아, 이거 복사-붙여넣기 하다가 실수하겠네…” 하는 생각이 들 때가 있죠?

바로 이럴 때 필요한 게 함수(Function)예요! 함수는 자주 사용하는 코드를 “레시피”처럼 저장해두고, 필요할 때마다 이름만 불러서 사용하는 거예요.

이 글에서는 함수의 기본부터 실전 활용까지, 여러분의 코드를 10배 더 깔끔하고 효율적으로 만드는 방법을 배워볼 거예요!

💡 시리즈 연결: 이전 글에서 변수, 조건문, 반복문을 배웠어요. 이제 그 코드들을 재사용 가능한 “함수”로 만드는 방법을 배워요!

함수가 뭐예요? 요리 레시피로 이해하기

함수(Function)는 특정 작업을 수행하는 코드 묶음이에요. 마치 요리 레시피처럼요!

🍳 김치볶음밥 레시피 재료: 밥, 김치, 계란, 기름 1. 팬에 기름 두르기 2. 김치 볶기 3. 밥 넣고 볶기 4. 계란 프라이 올리기 완성! 🍽️ 함수와 같아요! def make_bokkeumbap(): # 재료 준비 heat_pan() fry_kimchi() add_rice() add_egg() return “완성!” make_bokkeumbap() 레시피처럼 한 번 만들어두면 계속 재사용!

함수는 요리 레시피와 같아요 – 한 번 정의하면 이름만 불러서 사용!

요리할 때마다 레시피를 새로 만들지 않죠? 마찬가지로 프로그래밍에서도 자주 쓰는 코드를 함수로 만들어두면 편해요!

왜 함수를 써야 하나요? Before & After

실제 예시로 함수의 위력을 보여드릴게요.

❌ 함수 없이 작성 (반복 지옥)

# 급여 계산을 3번 해야 한다면… # 직원 1 base1 = 3000000 bonus1 = 500000 tax1 = (base1 + bonus1) * 0.1 result1 = base1 + bonus1 – tax1 print(f”직원1 실수령액: {result1:,}원”) # 직원 2 base2 = 3500000 bonus2 = 700000 tax2 = (base2 + bonus2) * 0.1 result2 = base2 + bonus2 – tax2 print(f”직원2 실수령액: {result2:,}원”) # 직원 3 base3 = 4000000 bonus3 = 800000 tax3 = (base3 + bonus3) * 0.1 result3 = base3 + bonus3 – tax3 print(f”직원3 실수령액: {result3:,}원”) # 😱 코드 중복이 심해요! 직원이 100명이면…?

✅ 함수 사용 (깔끔!)

# 함수 한 번만 정의 def calculate_salary(base, bonus): tax = (base + bonus) * 0.1 result = base + bonus – tax return result # 이제 함수 이름만 불러서 사용! salary1 = calculate_salary(3000000, 500000) salary2 = calculate_salary(3500000, 700000) salary3 = calculate_salary(4000000, 800000) print(f”직원1: {salary1:,}원”) print(f”직원2: {salary2:,}원”) print(f”직원3: {salary3:,}원”) # 😊 깔끔! 직원이 100명이어도 문제없어요!
💡 함수의 장점:
코드 재사용 – 한 번 작성하면 계속 사용
유지보수 쉬움 – 수정이 필요하면 함수만 고치면 됨
가독성 향상 – 복잡한 코드를 의미 있는 이름으로 표현
협업 용이 – 다른 사람도 쉽게 사용 가능

함수 만들기: def 키워드

함수는 def (definition의 약자) 키워드로 정의해요.

def 키워드 greet 함수 이름 ( name 매개변수 ): 콜론 필수! print(f”안녕, {name}!”) 들여쓰기 필수!

함수 정의 문법 – def, 함수명, 매개변수, 콜론, 들여쓰기

기본 함수 만들기

# 가장 간단한 함수 def say_hello(): print(“안녕하세요!”) # 함수 호출 (실행) say_hello() # “안녕하세요!” 출력 say_hello() # 몇 번이든 호출 가능!

매개변수(Parameter): 함수에 값 전달하기

매개변수는 함수에 전달하는 재료예요. 요리 레시피에서 “재료”와 같아요!

# 매개변수가 있는 함수 def greet(name): print(f”안녕하세요, {name}님!”) # 다른 값을 넣어서 호출 greet(“철수”) # 안녕하세요, 철수님! greet(“영희”) # 안녕하세요, 영희님! greet(“민수”) # 안녕하세요, 민수님!

여러 개의 매개변수

# 매개변수 2개 def calculate_area(width, height): area = width * height print(f”면적: {area}㎡”) calculate_area(5, 10) # 면적: 50㎡ calculate_area(8, 12) # 면적: 96㎡

🏢 실전 예제: 직원 정보 출력 함수

자동화 시나리오: 직원 100명의 정보를 보기 좋게 출력
def print_employee_info(name, position, salary): print(“=” * 40) print(f”👤 이름: {name}”) print(f”💼 직급: {position}”) print(f”💰 급여: {salary:,}원”) print(“=” * 40) # 함수 재사용! print_employee_info(“김철수”, “대리”, 3500000) print_employee_info(“이영희”, “과장”, 4500000) print_employee_info(“박민수”, “사원”, 2800000)
출력: ======================================== 👤 이름: 김철수 💼 직급: 대리 💰 급여: 3,500,000원 ======================================== ======================================== 👤 이름: 이영희 💼 직급: 과장 💰 급여: 4,500,000원 ======================================== ======================================== 👤 이름: 박민수 💼 직급: 사원 💰 급여: 2,800,000원 ========================================

반환값(Return): 함수의 결과 받기

return은 함수가 계산한 결과를 돌려주는 거예요. 요리로 치면 “완성된 요리”를 내는 것!

# return 없는 함수 – 그냥 출력만 def add_print(a, b): result = a + b print(result) # 출력만 함 # return 있는 함수 – 값을 돌려줌 def add_return(a, b): result = a + b return result # 값을 반환 # 차이점 add_print(5, 3) # 8 출력 (끝) x = add_print(5, 3) # 8 출력, x는 None result = add_return(5, 3) # 반환값을 변수에 저장! print(result * 2) # 16 (결과를 재사용 가능!)
💡 return의 역할:
• 함수의 결과값을 돌려줌
• return 만나면 함수 즉시 종료
• 반환값을 변수에 저장하거나 다른 함수에 전달 가능

💰 실전 예제: 할인 가격 계산 함수

자동화 시나리오: 상품 할인 가격을 자동으로 계산
def calculate_discount(price, discount_rate): “”” 할인 가격을 계산하는 함수 price: 원가 discount_rate: 할인율 (0.1 = 10%) “”” discount_amount = price * discount_rate final_price = price – discount_amount return final_price # 여러 상품의 할인 가격 계산 products = [ {“name”: “노트북”, “price”: 1500000}, {“name”: “마우스”, “price”: 50000}, {“name”: “키보드”, “price”: 120000} ] print(“🎉 블랙프라이데이 20% 할인!\n”) for item in products: original = item[“price”] discounted = calculate_discount(original, 0.2) saved = original – discounted print(f”{item[‘name’]}”) print(f” 정가: {original:,}원”) print(f” 할인: {discounted:,}원 (절약: {saved:,}원)\n”)
출력: 🎉 블랙프라이데이 20% 할인! 노트북 정가: 1,500,000원 할인: 1,200,000원 (절약: 300,000원) 마우스 정가: 50,000원 할인: 40,000원 (절약: 10,000원) 키보드 정가: 120,000원 할인: 96,000원 (절약: 24,000원)

기본값 매개변수: 선택적 인자

매개변수에 기본값을 설정하면, 값을 안 넣어도 작동해요!

# 기본값 설정 def greet(name, greeting=“안녕하세요”): print(f”{greeting}, {name}님!”) # 기본값 사용 greet(“철수”) # 안녕하세요, 철수님! # 다른 값 전달 greet(“영희”, “좋은 아침”) # 좋은 아침, 영희님! greet(“민수”, “반갑습니다”) # 반갑습니다, 민수님!

📧 실전 예제: 이메일 발송 함수

자동화 시나리오: 이메일 자동 발송 시스템
def send_email(to, subject, body, cc=None, urgent=False): “”” 이메일 발송 함수 to: 받는 사람 (필수) subject: 제목 (필수) body: 본문 (필수) cc: 참조 (선택) urgent: 긴급 여부 (선택, 기본값 False) “”” print(“📧 이메일 발송”) print(f”받는사람: {to}”) print(f”제목: {subject}”) print(f”본문: {body}”) if cc: print(f”참조: {cc}”) if urgent: print(“⚠️ [긴급]”) print(“✅ 발송 완료!\n”) # 일반 이메일 (기본값 사용) send_email(“team@company.com”, “회의 안내”, “내일 10시 회의실 A”) # 긴급 이메일 (urgent=True) send_email(“boss@company.com”, “긴급 보고”, “서버 장애 발생”, urgent=True) # 참조 포함 이메일 send_email(“client@email.com”, “계약서 송부”, “첨부 확인 부탁드립니다”, cc=“manager@company.com”)

여러 값 반환하기

파이썬은 함수에서 여러 개의 값을 한 번에 반환할 수 있어요!

def get_min_max(numbers): “””리스트에서 최솟값과 최댓값을 반환””” minimum = min(numbers) maximum = max(numbers) return minimum, maximum # 튜플로 반환 # 여러 값 받기 scores = [85, 92, 78, 95, 88] min_score, max_score = get_min_max(scores) print(f”최저 점수: {min_score}점”) print(f”최고 점수: {max_score}점”)

📊 실전 예제: 매출 통계 분석 함수

자동화 시나리오: 월별 매출 데이터를 분석해서 통계 반환
def analyze_sales(sales_data): “”” 매출 데이터 분석 반환: 총합, 평균, 최고, 최저 “”” total = sum(sales_data) average = total / len(sales_data) highest = max(sales_data) lowest = min(sales_data) return total, average, highest, lowest # 6개월 매출 데이터 monthly_sales = [45000000, 52000000, 48000000, 61000000, 55000000, 59000000] # 분석 결과 받기 total, avg, highest, lowest = analyze_sales(monthly_sales) print(“📊 상반기 매출 분석 결과”) print(“=” * 40) print(f”총 매출: {total:,}원”) print(f”월평균: {avg:,.0f}원”) print(f”최고 매출: {highest:,}원”) print(f”최저 매출: {lowest:,}원”) print(f”증가율: {((highest – lowest) / lowest * 100):.1f}%”)
출력: 📊 상반기 매출 분석 결과 ======================================== 총 매출: 320,000,000원 월평균: 53,333,333원 최고 매출: 61,000,000원 최저 매출: 45,000,000원 증가율: 35.6%

람다(Lambda) 함수: 한 줄 함수

람다 함수는 간단한 함수를 한 줄로 표현하는 방법이에요. 이름 없는 함수라서 “익명 함수”라고도 불러요.

# 일반 함수 def square(x): return x ** 2 # 람다 함수 (같은 기능) square_lambda = lambda x: x ** 2 print(square(5)) # 25 print(square_lambda(5)) # 25

람다 함수 실전 활용: 정렬

# 딕셔너리 리스트를 특정 키로 정렬 employees = [ {“name”: “철수”, “age”: 28, “salary”: 3500000}, {“name”: “영희”, “age”: 32, “salary”: 4500000}, {“name”: “민수”, “age”: 25, “salary”: 2800000} ] # 급여순 정렬 (람다 사용) sorted_by_salary = sorted(employees, key=lambda x: x[“salary”], reverse=True) for emp in sorted_by_salary: print(f”{emp[‘name’]}: {emp[‘salary’]:,}원”)
출력: 영희: 4,500,000원 철수: 3,500,000원 민수: 2,800,000원

실전 종합 예제: 성적 관리 시스템

지금까지 배운 모든 함수 개념을 활용한 완전한 프로그램을 만들어봐요!

🎓 종합 프로젝트: 학생 성적 관리 시스템
# 함수 1: 등급 계산 def calculate_grade(score): “””점수를 받아 등급을 반환””” if score >= 90: return “A” elif score >= 80: return “B” elif score >= 70: return “C” elif score >= 60: return “D” else: return “F” # 함수 2: 평균 계산 def calculate_average(scores): “””여러 점수의 평균을 반환””” return sum(scores) / len(scores) # 함수 3: 학생 성적표 출력 def print_report_card(name, subjects, scores): “””학생의 성적표를 출력””” print(“\n” + “=” * 50) print(f”📋 {name} 학생 성적표”) print(“=” * 50) for subject, score in zip(subjects, scores): grade = calculate_grade(score) print(f”{subject:<10} {score:>3}점 [{grade}]”) avg = calculate_average(scores) final_grade = calculate_grade(avg) print(“-“ * 50) print(f”평균: {avg:>5.1f}점 [{final_grade}]”) print(“=” * 50) # 함수 4: 반 전체 통계 def class_statistics(students): “””반 전체 통계를 출력””” all_averages = [] for student in students: avg = calculate_average(student[“scores”]) all_averages.append(avg) class_avg = calculate_average(all_averages) highest = max(all_averages) lowest = min(all_averages) print(“\n📊 반 전체 통계”) print(“=” * 50) print(f”학급 평균: {class_avg:.1f}점”) print(f”최고 평균: {highest:.1f}점”) print(f”최저 평균: {lowest:.1f}점”) # 학생 데이터 students = [ { “name”: “김철수”, “subjects”: [“국어”, “영어”, “수학”, “과학”], “scores”: [85, 92, 78, 88] }, { “name”: “이영희”, “subjects”: [“국어”, “영어”, “수학”, “과학”], “scores”: [95, 88, 92, 90] } ] # 실행 for student in students: print_report_card(student[“name”], student[“subjects”], student[“scores”]) class_statistics(students)
출력: ================================================== 📋 김철수 학생 성적표 ================================================== 국어 85점 [B] 영어 92점 [A] 수학 78점 [C] 과학 88점 [B] ————————————————– 평균: 85.8점 [B] ================================================== ================================================== 📋 이영희 학생 성적표 ================================================== 국어 95점 [A] 영어 88점 [B] 수학 92점 [A] 과학 90점 [A] ————————————————– 평균: 91.2점 [A] ================================================== 📊 반 전체 통계 ================================================== 학급 평균: 88.5점 최고 평균: 91.2점 최저 평균: 85.8점

와! 함수를 사용하니 코드가 정말 깔끔하고 이해하기 쉽죠? 각 함수가 하나의 명확한 역할을 담당해요!

초보자가 자주 하는 실수 Top 5

실수 1: 함수 정의와 호출 헷갈림

# ❌ 함수 정의만 하고 호출 안 함 def say_hello(): print(“안녕!”) # 아무 일도 안 일어남 – 호출을 안 했으니까! # ✅ 올바른 방법 def say_hello(): print(“안녕!”) say_hello() # 함수 호출해야 실행됨!

실수 2: return 빼먹기

# ❌ return 없으면 None 반환 def add(a, b): result = a + b # return 없음! x = add(5, 3) print(x) # None # ✅ 올바른 방법 def add(a, b): result = a + b return result # 반환 필수!

실수 3: 매개변수 순서 틀림

# ❌ 순서 주의! def divide(a, b): return a / b result = divide(10, 2) # 10 / 2 = 5 result2 = divide(2, 10) # 2 / 10 = 0.2 (순서 바뀜!) # ✅ 키워드 인자로 명확하게 result = divide(a=10, b=2) # 명확!

실수 4: 함수 안에서 전역 변수 수정

# ❌ 전역 변수를 함수에서 직접 수정 (나쁜 습관) count = 0 def increase(): global count # 가능하지만 권장하지 않음 count += 1 # ✅ 올바른 방법: 매개변수와 반환값 사용 def increase(count): return count + 1 count = 0 count = increase(count) # 명확하고 안전!

실수 5: 기본값에 빈 리스트 사용

# ❌ 위험! 기본값이 공유됨 def add_item(item, my_list=[]): my_list.append(item) return my_list print(add_item(“A”)) # [“A”] print(add_item(“B”)) # [“A”, “B”] – 어?! # ✅ 올바른 방법 def add_item(item, my_list=None): if my_list is None: my_list = [] my_list.append(item) return my_list

유용한 내장 함수들

파이썬에는 이미 만들어진 유용한 함수들이 많아요!

함수 기능 예시
len() 길이/개수 len([1, 2, 3]) → 3
max() 최댓값 max([1, 5, 3]) → 5
min() 최솟값 min([1, 5, 3]) → 1
sum() 합계 sum([1, 2, 3]) → 6
abs() 절댓값 abs(-5) → 5
round() 반올림 round(3.7) → 4
sorted() 정렬 sorted([3, 1, 2]) → [1, 2, 3]
type() 자료형 확인 type(5) → int

마무리: 함수로 코드 마스터!

축하합니다! 🎉 이제 여러분은 함수를 활용해서 코드를 재사용하고, 복잡한 프로그램을 간단하게 만들 수 있어요!

🎯 오늘 배운 것 체크리스트:
✅ 함수가 뭔지 (요리 레시피 비유)
✅ def 키워드로 함수 정의
✅ 매개변수로 값 전달
✅ return으로 결과 반환
✅ 기본값 매개변수
✅ 여러 값 반환하기
✅ 람다 함수 (한 줄 함수)
✅ 실전 프로젝트 (성적 관리 시스템)
✅ 자주 하는 실수 5가지
✅ 유용한 내장 함수들

함수의 핵심 원칙:

  • 하나의 함수는 하나의 일만 – 역할을 명확하게
  • 함수명은 동사로 – calculate, print, get, set 등
  • 매개변수는 적을수록 좋음 – 보통 3개 이하 권장
  • 주석 달기 – 무엇을 하는 함수인지 설명

다음 시리즈에서는 모듈과 패키지를 배워서 다른 사람이 만든 함수들을 가져다 쓰는 방법을 알아볼 거예요!

같은 코드 반복하지 마세요. 함수로 만드세요! 💪

error: Content is protected !!