파이썬 함수의 재발견: *args와 **kwargs의 모든 것
파이썬에서 함수는 특정 작업을 수행하는 코드 묶음입니다. 지금까지 우리는 함수를 만들 때, 함수가 받을 '입력값'의 개수를 미리 정해주곤 했습니다. 하지만 때로는 함수가 받아야 할 입력값의 개수를 미리 알 수 없거나, 입력값이 너무 많아 일일이 이름을 정해주기 번거로울 때가 있습니다.
이런 상황에서 파이썬의 *args와 **kwargs는 구원투수처럼 등장합니다. 이들은 함수가 '유연하게' 원하는 만큼의 입력값을 받도록 도와주는 특별한 문법입니다. 마치 어떤 모임에서 몇 명이 올지 모르지만, 모두에게 필요한 것을 제공할 수 있도록 준비하는 것과 같습니다.
이번 강의에서는 *args와 **kwargs가 무엇인지, 어떻게 사용하며 왜 유용한지 자세히 알아보겠습니다. 이 개념을 이해하면 여러분의 파이썬 코딩 실력이 한 단계 더 성장할 것입니다.
*args: 개수 제한 없는 입력값 받기
*args는 'arguments'의 줄임말로, 함수가 예측할 수 없는 개수의 '위치 인자(positional arguments)'를 받을 때 사용합니다. 여기서 '위치 인자'란, 함수를 호출할 때 순서대로 전달하는 입력값을 의미합니다. 별표(*)는 "남아있는 모든 입력값을 모아 튜플(tuple)이라는 꾸러미에 담아주세요!"라는 뜻입니다. 튜플은 순서가 있는 값들의 묶음으로, 한 번 만들면 내용을 바꿀 수 없는 특징이 있습니다.
실습 코드 예시 1: *args로 여러 숫자 더하기
이 예제에서는 *args를 사용하여 함수가 몇 개의 숫자를 받든 관계없이 모든 숫자를 더하는 함수를 만들어보겠습니다. 함수를 정의할 때 *numbers라고 쓰면, numbers는 전달받은 모든 숫자를 담은 튜플이 됩니다.
위 코드를 실행하면 다음과 같은 결과가 화면에 나타납니다.
총합: 150
총합: 0
**kwargs: 이름표가 붙은 입력값 받기
**kwargs는 'keyword arguments'의 줄임말로, 함수가 예측할 수 없는 개수의 '키워드 인자(keyword arguments)'를 받을 때 사용합니다. 키워드 인자는 이름=값 형태로 전달되는 입력값입니다. 별표 두 개(**)는 "남아있는 모든 이름표 붙은 입력값을 딕셔너리(dictionary)라는 상자에 담아주세요!"라는 뜻입니다. 딕셔너리는 '이름(키)'과 '값'이 짝을 이루는 데이터 묶음입니다. 우리가 흔히 사용하는 전화번호부와 비슷하다고 생각하면 됩니다.
실습 코드 예시 2: **kwargs로 사용자 정보 처리하기
이 예제에서는 **kwargs를 사용하여 사용자 정보를 받아서 출력하는 함수를 만들어보겠습니다. **user_info라고 쓰면, user_info는 전달받은 모든 이름표 붙은 값을 담은 딕셔너리가 됩니다.
위 코드를 실행하면 다음과 같은 결과가 화면에 나타납니다.
name: 김철수
age: 30
------------------
--- 사용자 프로필 ---
name: 이영희
city: 부산
job: 개발자
------------------
실습 코드 예시 3: *args와 **kwargs 함께 사용하기
함수 정의 시, 일반 인자, *args, **kwargs 순서로 배치할 수 있습니다. 파이썬은 이 순서를 통해 어떤 입력값이 어디에 해당하는지 정확히 구분합니다. 예를 들어, 특정 주요 값은 일반 인자로 받고, 나머지 다양한 부가 정보는 *args와 **kwargs로 처리할 수 있습니다.
위 코드를 실행하면 다음과 같은 결과가 화면에 나타납니다.
--- 주문 처리 완료 ---
주문 상품: 피자
추가 옵션: ('페퍼로니 추가', '콜라 포함')
--- 주문 처리 완료 ---
주문 상품: 책
상세 정보:
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)'에 대해 깊이 있게 탐구해 보겠습니다.
질문이 있다면 댓글에 남겨주세요.
실제 코딩이 잘 되었는지 터미널 출력 결과도 꼭 확인하세요.