본문 바로가기
카테고리 없음

파이썬 함수의 재발견: *args와 **kwargs의 모든 것

by chapter21 2025. 5. 23.

파이썬 함수의 재발견: *args와 **kwargs의 모든 것

파이썬에서 함수는 특정 작업을 수행하는 코드 묶음입니다. 지금까지 우리는 함수를 만들 때, 함수가 받을 '입력값'의 개수를 미리 정해주곤 했습니다. 하지만 때로는 함수가 받아야 할 입력값의 개수를 미리 알 수 없거나, 입력값이 너무 많아 일일이 이름을 정해주기 번거로울 때가 있습니다.

이런 상황에서 파이썬의 *args**kwargs는 구원투수처럼 등장합니다. 이들은 함수가 '유연하게' 원하는 만큼의 입력값을 받도록 도와주는 특별한 문법입니다. 마치 어떤 모임에서 몇 명이 올지 모르지만, 모두에게 필요한 것을 제공할 수 있도록 준비하는 것과 같습니다.

이번 강의에서는 *args**kwargs가 무엇인지, 어떻게 사용하며 왜 유용한지 자세히 알아보겠습니다. 이 개념을 이해하면 여러분의 파이썬 코딩 실력이 한 단계 더 성장할 것입니다.

*args: 개수 제한 없는 입력값 받기

*args는 'arguments'의 줄임말로, 함수가 예측할 수 없는 개수의 '위치 인자(positional arguments)'를 받을 때 사용합니다. 여기서 '위치 인자'란, 함수를 호출할 때 순서대로 전달하는 입력값을 의미합니다. 별표(*)는 "남아있는 모든 입력값을 모아 튜플(tuple)이라는 꾸러미에 담아주세요!"라는 뜻입니다. 튜플은 순서가 있는 값들의 묶음으로, 한 번 만들면 내용을 바꿀 수 없는 특징이 있습니다.

실습 코드 예시 1: *args로 여러 숫자 더하기

이 예제에서는 *args를 사용하여 함수가 몇 개의 숫자를 받든 관계없이 모든 숫자를 더하는 함수를 만들어보겠습니다. 함수를 정의할 때 *numbers라고 쓰면, numbers는 전달받은 모든 숫자를 담은 튜플이 됩니다.

Python
def sum_all_numbers(*numbers): # numbers는 튜플 형태로 전달됩니다. total = 0 for num in numbers: total += num print(f"총합: {total}") # 2개의 숫자 더하기 sum_all_numbers(1, 2) # 5개의 숫자 더하기 sum_all_numbers(10, 20, 30, 40, 50) # 숫자가 없어도 가능합니다. sum_all_numbers()

위 코드를 실행하면 다음과 같은 결과가 화면에 나타납니다.

(0,0,0,0.12); position: relative;">
출력 결과
총합: 3
총합: 150
총합: 0

**kwargs: 이름표가 붙은 입력값 받기

**kwargs는 'keyword arguments'의 줄임말로, 함수가 예측할 수 없는 개수의 '키워드 인자(keyword arguments)'를 받을 때 사용합니다. 키워드 인자는 이름=값 형태로 전달되는 입력값입니다. 별표 두 개(**)는 "남아있는 모든 이름표 붙은 입력값을 딕셔너리(dictionary)라는 상자에 담아주세요!"라는 뜻입니다. 딕셔너리는 '이름(키)'과 '값'이 짝을 이루는 데이터 묶음입니다. 우리가 흔히 사용하는 전화번호부와 비슷하다고 생각하면 됩니다.

실습 코드 예시 2: **kwargs로 사용자 정보 처리하기

이 예제에서는 **kwargs를 사용하여 사용자 정보를 받아서 출력하는 함수를 만들어보겠습니다. **user_info라고 쓰면, user_info는 전달받은 모든 이름표 붙은 값을 담은 딕셔너리가 됩니다.

Python
def print_user_profile(**user_details): # user_details는 딕셔너리 형태로 전달됩니다. print("--- 사용자 프로필 ---") for key, value in user_details.items(): print(f"{key}: {value}") print("------------------") # 이름과 나이 정보만 전달 print_user_profile(name="김철수", age=30) # 이름, 도시, 직업 정보 전달 print_user_profile(name="이영희", city="부산", job="개발자")

위 코드를 실행하면 다음과 같은 결과가 화면에 나타납니다.

출력 결과
--- 사용자 프로필 ---
name: 김철수
age: 30
------------------
--- 사용자 프로필 ---
name: 이영희
city: 부산
job: 개발자
------------------

실습 코드 예시 3: *args와 **kwargs 함께 사용하기

함수 정의 시, 일반 인자, *args, **kwargs 순서로 배치할 수 있습니다. 파이썬은 이 순서를 통해 어떤 입력값이 어디에 해당하는지 정확히 구분합니다. 예를 들어, 특정 주요 값은 일반 인자로 받고, 나머지 다양한 부가 정보는 *args**kwargs로 처리할 수 있습니다.

Python
def process_order(item, *options, **details): print(f"주문 상품: {item}") if options: print(f"추가 옵션: {options}") if details: print("상세 정보:") for key, value in details.items(): print(f" {key}: {value}") print("--- 주문 처리 완료 ---\n") # 기본 상품만 주문 process_order("커피") # 상품과 추가 옵션 주문 process_order("피자", "페퍼로니 추가", "콜라 포함") # 상품과 상세 정보 주문 process_order("책", author="홍길동", year=2023) # 상품, 추가 옵션, 상세 정보 모두 주문 process_order("스마트폰", "케이스", "강화유리", color="블랙", storage="256GB")

위 코드를 실행하면 다음과 같은 결과가 화면에 나타납니다.

출력 결과
주문 상품: 커피
--- 주문 처리 완료 ---

주문 상품: 피자
추가 옵션: ('페퍼로니 추가', '콜라 포함')
--- 주문 처리 완료 ---

주문 상품: 책
상세 정보:
author: 홍길동
year: 2023
--- 주문 처리 완료 ---

주문 상품: 스마트폰
추가 옵션: ('케이스', '강화유리')
상세 정보:
color: 블랙
storage: 256GB
--- 주문 처리 완료 ---

추가 팁: *와 **로 자료형 펼치기 (언패킹)

***는 함수를 정의할 때뿐만 아니라, 함수를 호출할 때 리스트나 딕셔너리에 있는 값들을 마치 여러 개의 입력값처럼 '펼쳐서' 전달하는 데도 사용됩니다. 예를 들어, my_list = [1, 2, 3]이 있다면 my_function(*my_list)my_function(1, 2, 3)과 똑같이 작동합니다. 딕셔너리도 마찬가지입니다.

주의:

함수를 정의할 때 *args**kwargs를 일반 인자와 함께 사용할 때는 순서가 매우 중요합니다. 일반 인자 → *args**kwargs 순서를 반드시 지켜야 합니다. 이 순서를 지키지 않으면 오류가 발생할 수 있습니다.

핵심 : *args는 함수가 개수 제한 없이 '위치 인자'를 받아 튜플로 묶어주고, **kwargs는 개수 제한 없이 '키워드 인자(이름=값)'를 받아 딕셔너리로 묶어줍니다. 이들을 사용하면 함수를 훨씬 더 유연하게 만들 수 있습니다.

마무리 요약

이번 시간에는 파이썬 함수에서 *args**kwargs를 사용하는 방법을 자세히 알아보았습니다. 이 두 가지 특별한 문법은 함수를 훨씬 더 유연하고 강력하게 만들어주며, 여러분이 다양한 상황에 대처할 수 있는 프로그램을 만들 수 있도록 돕습니다. 이제 함수에 어떤 입력값이 들어올지 정확히 알 수 없을 때도 당황하지 않고 대처할 수 있을 것입니다.

다음 강의에서는 함수와 관련된 또 다른 중요한 개념인 '스코프(Scope)'와 '클로저(Closure)'에 대해 깊이 있게 탐구해 보겠습니다.

질문이 있다면 댓글에 남겨주세요.

실제 코딩이 잘 되었는지 터미널 출력 결과도 꼭 확인하세요.