콘텐츠로 이동

01. 함수 (행동 단위 분리)

"함수는 자판기입니다. 재료(Input)를 넣으면 결과물(Output)이 나옵니다. 더 중요한 건, 하나의 구체적인 행동(동사)을 정의하는 것입니다."

1. 함수의 구조

수학의 함수 $f(x) = x + 1$ 과 똑같습니다.

def make_coffee(bean, water):  # 재료 (Parameter)
    """
    커피콩과 물을 받아서 커피를 만드는 함수입니다. 
    (이런 설명을 'Docstring'이라고 합니다)
    """
    result = bean + water      # 로직 (Body)
    return result              # 결과물 (Return Value)

Return과 Print의 차이?

  • print(결과): 화면에 보여주고 증발합니다. (다른 요리에 재료로 못 씀)
  • return 결과: 결과를 뱉어내서 변수에 담을 수 있습니다. (다른 요리의 재료로 씀)

2. 왜 함수를 쓰는가?

  1. 재사용: 똑같은 코드를 여러 번 치기 싫어서.
  2. 가독성: 코드가 "어떻게(How)" 구현되었는지 숨기고, "무엇을(What)" 하는지 보여주기 위해서.

❌ 나쁜 예 (절차 지향)

# 라면 끓이기
print("물 550ml 넣기")
print("물 끓이기")
print("스프와 면 넣기")
print("4분 기다리기")

✅ 좋은 예 (함수형)

def boil_ramen(water_ml, time_min):
    # ... 복잡한 과정 ...
    return "맛있는 라면"

# 읽는 사람은 "물 550ml, 4분 끓이면 라면이 나오는구나"만 알면 됨
my_lunch = boil_ramen(550, 4)

3. 스코프 (Scope) - 변수의 유효 범위

함수 안에서 만든 변수는 함수 안에서만 살아있습니다. 이건 불편한 게 아니라, 안전한 것입니다.

def secret_room():
    money = 10000  # 지역 변수 (Local Variable)

secret_room()
# print(money) -> 에러! (NameError)
함수 밖의 전역 변수(Global Variable)를 함부로 가져다 쓰거나 수정하면 코드가 길어졌을 때 버그를 잡을 수 없습니다. 함수는 되도록 자기한테 주어진 인자(Argument)만 가지고 일해야 합니다 (Pure Function).