함수 기초
수업 목표
- 함수(Function)의 본질을 이해하고, 코드 모듈화와 재사용을 통해 유지보수성이 높은 코드를 작성할 수 있다.
- 매개변수(Parameter)와 반환값(Return Value)의 흐름을 분석하여 정확한 구조를 지닌 함수를 정의(
def)할 수 있다. - 지역 변수(Local Variable)와 전역 변수(Global Variable)의 유효 범위(Scope) 차이를 알고 구별하여 활용할 수 있다.
return예약어와 조기 종료(Early Exit) 패턴을 사용하여 복잡하게 얽힌 함수의 흐름을 깔끔하게 리팩토링할 수 있다.
생각해보기: 빵을 굽는 기계와 만능 도구집
식빵을 만들기 위해 밀가루를 반죽하고, 발효시키고, 오븐에 굽는 모든 번거로운 단계를 식빵을 먹을 때마다 매번 새로 수행한다면 대단히 지칠 것입니다. 대신 밀가루 반죽과 구워주는 과정이 자동 설계된 "제빵기"를 하나 마련해 두면, 필요할 때마다 재료(재료 투입)만 넣고 버튼을 눌러 결과물(완성된 식빵)을 편하게 꺼내 먹을 수 있습니다.
프로그래밍의 **함수(Function)**가 바로 이 제빵기와 같습니다. 반복적으로 수행해야 하는 긴 코드를 하나의 독립된 기계 안에 모듈로 조립해 두고, 필요할 때마다 간결하게 호출하여 재활용하는 함수의 작성 수칙과 설계 기법을 배워봅시다.
1. 함수의 기본 구조 — 기계 정의하고 작동시키기
파이썬에서는 def(Define의 약자) 예약어를 사용하여 함수를 선언합니다. 함수는 입력값인 매개변수(Parameter)를 받아 일을 처리한 후, 결과값인 반환값(Return Value)을 되돌려줍니다.
# 1. 두 수를 더해 결과를 돌려주는 함수 정의
def add_numbers(num1, num2): # num1, num2는 매개변수
result = num1 + num2
return result # 결과값 반환
# 2. 정의한 함수를 호출하여 사용
total = add_numbers(10, 20) # 10, 20은 인자(Argument)
print(total) # 출력 결과: 30
함수 안의 코드도 조건문/반복문과 마찬가지로 반드시 들여쓰기 4칸 규칙에 맞춰 작성되어야 합니다.
2. 변수의 유효 범위 — 지역 변수 vs 전역 변수
변수가 어디서 선언되었느냐에 따라 해당 변수를 읽고 쓸 수 있는 공간의 영역이 제한됩니다. 이를 **스코프(Scope)**라고 합니다.
- 지역 변수 (Local Variable): 함수 내부에서 생성된 변수입니다. 오직 해당 함수 안에서만 존재하며 함수 호출이 끝나면 사라집니다.
- 전역 변수 (Global Variable): 함수 바깥(메인 코드)에서 생성된 변수입니다. 프로그램 전체 영역에서 접근이 가능합니다.
# 전역 변수 선언
gold = 1000
def use_item():
# 지역 변수 선언
item_cost = 200
print(f"함수 내부: {gold - item_cost}") # 전역 변수 gold에 접근 가능
use_item()
# print(item_cost) # 에러 발생: NameError (item_cost는 함수 밖에서 찾을 수 없음)
3. return 예약어와 조기 종료 (Early Exit) 패턴
return은 함수의 최종 연산 결과물을 돌려주는 역할 외에 **"함수의 작동을 즉시 중단하고 호출처로 복귀한다"**는 탈출의 기능도 가지고 있습니다.
이 성격을 이용하면 복잡한 if-else 중첩 구조를 걷어내고, 에러 상황이나 차단해야 할 예외를 함수 상단에서 빠르게 쳐내어 코드 깊이를 획기적으로 줄일 수 있습니다.
# [나쁜 예: 정상적인 로직을 복잡한 else 안에 감금하여 들여쓰기 낭비]
# def process_payment(amount):
# if amount <= 0:
# print("오류: 올바르지 않은 금액입니다.")
# else:
# # ... 아주 길고 복잡한 결제 처리 로직 ...
# [조기 종료 패턴 적용 예: 가독성 극대화]
def process_payment(amount):
if amount <= 0:
print("오류: 올바르지 않은 금액입니다.")
return # ⚠️ 아무것도 반환하지 않고 즉시 함수 실행 중단 및 탈출
# 아래는 불필요한 들여쓰기 없이 깔끔하게 구현하는 정상 결제 처리 영역
print(f"{amount}원 결제 완료 절차를 정상 진행합니다.")
자주 하는 실수 & 오류 예방
1. return문 작성 누락 및 None 반환 오류
함수가 계산 결과를 가공해 놓고도 return을 명시하지 않으면, 컴퓨터는 None(아무것도 없음) 값을 기본값으로 되돌려줍니다.
def calculate_area(w, h):
area = w * h # 계산은 했으나 return이 누락됨!
result = calculate_area(5, 5)
print(result) # 출력 결과: None
오류 해결: 함수 밖으로 연산 결과 데이터를 밀어내어 변수에 담고자 할 때는 반드시 끝 단에 `return 결과값` 수식을 빠뜨리지 마십시오.
2. 함수 바깥에서 지역 변수를 호출하는 실수
함수 안에서 잠시 사용된 임시 계산용 지역 변수를 함수 바깥 메인 루프나 다른 함수에서 바로 접근하려고 할 때 발생하는 NameError입니다.
핵심 정리
| 구분 | 유효 범위 및 생명 주기 | 코드 내 접근 한계 |
|---|---|---|
| 전역 변수 | 프로그램 시작부터 종료 전까지 생존 | 함수 내부/바깥 어디서든 읽기(Read) 접근 가능 |
| 지역 변수 | 함수가 실행되는 동안에만 잠깐 생성되었다 소멸 | 선언된 해당 함수 내부에서만 사용 가능, 외부 조회 불가능 |
| 조기 종료 | 에러 감지 즉시 return 강제 복귀 |
불필요한 중첩 if-else 구문을 예방하는 핵심 클린코드 기법 |
이번 주 대회 바로가기
1반 | 2반 | 3반 | 4반 | 5반 | 6반 | 7반 | 8반 | 9반
※ 대회 링크는 선생님이 별도 공지합니다.