함수의 매개변수(Parameter)와 인자(Argument): 함수와의 소통 방식
1. 서론: 함수에 데이터를 전달하는 다채로운 방법
이전 챕터에서 우리는 파이썬 함수의 기본적인 개념과 정의, 그리고 호출 방법을 배웠습니다. 함수는 특정 작업을 수행하는 재사용 가능한 코드 블록이며, 외부로부터 값을 받아와 그 값을 사용하여 작업을 수행할 수 있습니다. 이때 함수 정의 시 함수가 받을 값을 명시하는 것이 ‘매개변수(Parameter)’이고, 함수를 호출할 때 매개변수에 실제로 전달하는 값이 ‘인자(Argument)’입니다. 파이썬은 함수에 인자를 전달하는 다양한 방식을 제공하여, 개발자가 상황에 따라 가장 적절하고 유연한 방법을 선택할 수 있도록 돕습니다. 이 챕터에서는 매개변수와 인자의 개념을 명확히 이해하고, 위치 인자, 키워드 인자, 기본값 매개변수, 가변 인자 등 파이썬의 다채로운 인자 전달 방식에 대해 깊이 있게 알아보겠습니다. 함수의 매개변수와 인자를 자유자재로 다루는 능력은 여러분의 파이썬 함수 활용 능력을 한 단계 더 끌어올리고, 더욱 유연하고 강력한 함수를 작성하는 데 필수적인 단계가 될 것입니다.
2. 매개변수(Parameter)와 인자(Argument)의 이해
함수를 정의할 때 괄호 안에 명시하는 것이 매개변수(Parameter)이고, 함수를 호출할 때 매개변수에 실제로 전달하는 값이 인자(Argument)입니다. 이 둘은 종종 혼용되지만, 엄밀히 말하면 다른 개념입니다.
- 매개변수 (Parameter): 함수 정의 시 함수가 받을 값을 나타내는 변수입니다. 함수의 ‘입력’을 정의합니다.
- 인자 (Argument): 함수를 호출할 때 매개변수에 실제로 전달되는 값입니다. 함수의 ‘입력 값’입니다.
def greet(name, message): # name, message는 매개변수 (Parameter)
print(f"안녕하세요, {name}님! {message}")
greet("Alice", "좋은 하루 되세요!") # "Alice", "좋은 하루 되세요!"는 인자 (Argument)
3. 인자 전달 방식
파이썬은 함수에 인자를 전달하는 여러 가지 방식을 제공합니다.
3.1. 위치 인자 (Positional Arguments)
가장 기본적인 방식으로, 함수 호출 시 인자의 순서가 매개변수의 순서와 일치해야 합니다. 인자의 위치에 따라 매개변수에 할당됩니다.
def divide(a, b):
if b == 0:
print("0으로 나눌 수 없습니다.")
return
return a / b
result = divide(10, 2) # 10이 a에, 2가 b에 할당됩니다.
print(result) # 출력: 5.0
result2 = divide(2, 10) # 순서가 바뀌면 결과도 바뀝니다.
print(result2) # 출력: 0.2
3.2. 키워드 인자 (Keyword Arguments)
함수 호출 시 매개변수이름=값 형태로 인자를 전달하는 방식입니다. 인자의 순서에 상관없이 매개변수 이름에 따라 값이 할당됩니다. 코드의 가독성을 높이는 데 유용합니다.
def introduce(name, age, city):
print(f"이름: {name}, 나이: {age}세, 도시: {city}")
# 위치 인자 방식
introduce("Bob", 30, "Seoul")
# 키워드 인자 방식 (순서 상관 없음)
introduce(age=30, city="Seoul", name="Bob")
# 위치 인자와 키워드 인자 혼합 사용 (위치 인자가 먼저 와야 합니다)
introduce("Charlie", city="Busan", age=25)
주의: 위치 인자 뒤에 키워드 인자가 와야 합니다. 키워드 인자 뒤에 위치 인자가 오면 오류가 발생합니다.
# introduce(name="David", 40, "Jeju") # SyntaxError: positional argument follows keyword argument
3.3. 기본값 매개변수 (Default Parameter Values)
함수 정의 시 매개변수에 기본값을 지정할 수 있습니다. 함수 호출 시 해당 매개변수에 인자를 전달하지 않으면 기본값이 사용됩니다. 기본값 매개변수는 항상 일반 매개변수 뒤에 와야 합니다.
def send_message(message, sender="System", receiver="User"):
print(f"[{sender}] -> [{receiver}]: {message}")
# 기본값 사용
send_message("환영합니다!") # 출력: [System] -> [User]: 환영합니다!
# sender만 변경
send_message("새로운 알림입니다.", sender="Admin") # 출력: [Admin] -> [User]: 새로운 알림입니다.
# receiver만 변경 (키워드 인자 사용)
send_message("개인 메시지입니다.", receiver="Alice") # 출력: [System] -> [Alice]: 개인 메시지입니다.
# 모두 변경
send_message("긴급 공지!", "Emergency", "All Users") # 출력: [Emergency] -> [All Users]: 긴급 공지!
주의: 기본값 매개변수는 항상 일반 매개변수 뒤에 정의되어야 합니다.
# def func(a, b=1, c): # SyntaxError: non-default argument follows default argument
# pass
3.4. 가변 인자 (Arbitrary Arguments)
함수가 받을 인자의 개수를 미리 알 수 없을 때 사용합니다. 두 가지 형태가 있습니다.
3.4.1. 위치 가변 인자 (*args)
매개변수 앞에 *를 붙이면, 함수 호출 시 전달되는 여러 개의 위치 인자들을 튜플 형태로 묶어서 받습니다. 관례적으로 *args라고 명명합니다.
def calculate_sum(*numbers):
total = 0
for num in numbers:
total += num
return total
print(calculate_sum(1, 2, 3)) # 출력: 6
print(calculate_sum(10, 20, 30, 40)) # 출력: 100
print(calculate_sum()) # 출력: 0
3.4.2. 키워드 가변 인자 (**kwargs)
매개변수 앞에 **를 붙이면, 함수 호출 시 전달되는 여러 개의 키워드 인자들을 딕셔너리 형태로 묶어서 받습니다. 관례적으로 **kwargs라고 명명합니다.
def print_profile(**profile_data):
print("--- 사용자 프로필 ---")
for key, value in profile_data.items():
print(f"{key.capitalize()}: {value}")
print_profile(name="Alice", age=25, city="Seoul")
# 출력:
# --- 사용자 프로필 ---
# Name: Alice
# Age: 25
# City: Seoul
print_profile(product="Laptop", price=1200)
# 출력:
# --- 사용자 프로필 ---
# Product: Laptop
# Price: 1200
3.4.3. *args와 **kwargs 함께 사용
두 가지 가변 인자를 함께 사용할 때는 *args가 **kwargs보다 먼저 와야 합니다.
def process_data(fixed_arg, *args, **kwargs):
print(f"고정 인자: {fixed_arg}")
print(f"위치 가변 인자 (args): {args}")
print(f"키워드 가변 인자 (kwargs): {kwargs}")
process_data(10, 20, 30, name="Bob", age=40)
# 출력:
# 고정 인자: 10
# 위치 가변 인자 (args): (20, 30)
# 키워드 가변 인자 (kwargs): {'name': 'Bob', 'age': 40}
4. 인자 언패킹 (Argument Unpacking)
리스트나 튜플의 요소들을 위치 인자로, 딕셔너리의 키-값 쌍을 키워드 인자로 함수에 전달할 때 *와 ** 연산자를 사용할 수 있습니다. 이를 ‘인자 언패킹(Argument Unpacking)’이라고 합니다.
def display_info(a, b, c):
print(f"a: {a}, b: {b}, c: {c}")
# 리스트/튜플 언패킹 (*)
my_list = [1, 2, 3]
display_info(*my_list) # display_info(1, 2, 3)과 동일
# 출력: a: 1, b: 2, c: 3
my_tuple = (4, 5, 6)
display_info(*my_tuple) # display_info(4, 5, 6)과 동일
# 출력: a: 4, b: 5, c: 6
# 딕셔너리 언패킹 (**)
def print_details(name, age):
print(f"이름: {name}, 나이: {age}")
person_data = {"name": "Charlie", "age": 35}
print_details(**person_data) # print_details(name="Charlie", age=35)와 동일
# 출력: 이름: Charlie, 나이: 35
5. 결론: 유연하고 강력한 함수 설계의 핵심
이 챕터를 통해 여러분은 파이썬 함수의 매개변수와 인자의 개념을 명확히 이해하고, 위치 인자, 키워드 인자, 기본값 매개변수, 가변 인자(*args, **kwargs) 등 파이썬의 다채로운 인자 전달 방식에 대해 깊이 있게 학습했습니다. 또한, 인자 언패킹을 통해 리스트/튜플이나 딕셔너리의 데이터를 함수에 효율적으로 전달하는 방법도 살펴보았습니다.
함수에 인자를 전달하는 다양한 방식들을 마스터하는 것은 여러분이 더욱 유연하고 강력한 함수를 설계하고 작성하는 데 필수적인 능력입니다. 상황에 따라 가장 적절한 인자 전달 방식을 선택함으로써 코드의 가독성을 높이고, 함수의 재사용성을 극대화할 수 있습니다.
이제 여러분은 파이썬 함수의 기본 개념과 함께, 함수에 데이터를 전달하는 다양한 방법까지 익혔습니다. 다음 챕터에서는 함수가 작업을 수행한 후 결과를 호출자에게 돌려주는 ‘함수의 반환 값(Return Value)’에 대해 자세히 알아보겠습니다. return 문은 함수의 결과물을 활용하는 데 핵심적인 역할을 하므로, 오늘 배운 인자 전달 방식을 활용하여 다양한 함수를 직접 만들어 보면서, 여러분의 파이썬 실력을 더욱 단단하게 다지세요!
