
파이썬 프로그래밍을 하다 보면 함수 정의나 호출부, 혹은 리스트와 딕셔너리를 다룰 때 *(Asterisk)와 **(Double Asterisk) 기호를 자주 마주하게 됩니다. 단순히 곱셈이나 거듭제곱 연산자로만 알고 있다면, 파이썬이 제공하는 '가장 강력하고 우아한 도구' 중 하나인 언패킹(Unpacking) 기능을 놓치고 있는 것입니다. 언패킹은 반복 가능한(Iterable) 객체에 담긴 요소를 개별 인자로 풀거나, 여러 데이터를 하나의 구조로 병합할 때 사용됩니다. 본 가이드에서는 코드의 가독성을 비약적으로 높여주고 복잡한 데이터 구조를 단순하게 처리해주는 *와 ** 연산자의 모든 것을 전문적으로 파헤쳐 봅니다.
1. Asterisk(*)와 Double Asterisk(**)의 정의와 차이
파이썬에서 언패킹 연산자는 크게 두 가지로 분류됩니다. 핵심은 '어떤 데이터 타입을 다루는가'에 있습니다.
| * | Single Asterisk | List, Tuple, Set, String 등 | 반복 가능한 객체의 요소를 개별 인자로 전개 |
| ** | Double Asterisk | Dictionary (Mapping) | 딕셔너리의 키-값 쌍을 키워드 인자로 전개 |
2. Single Asterisk(*)의 마법: 반복 가능 객체의 해체
2.1 함수 호출 시의 인자 전달
함수가 여러 개의 인자를 요구할 때, 리스트나 튜플에 담긴 값을 일일이 인덱스로 접근하여 전달하는 것은 매우 비효율적입니다. 이때 *를 사용하면 객체를 자동으로 해체하여 함수에 전달합니다.
def calculate_volume(length, width, height):
return length * width * height
dimensions = [10, 5, 2]
# 잘못된 예: calculate_volume(dimensions[0], dimensions[1], dimensions[2])
# 언패킹 활용:
result = calculate_volume(*dimensions)
print(f"부피: {result}") # 출력: 100
2.2 리스트 및 반복 가능 객체 병합
여러 리스트를 하나로 합치거나, 기존 리스트의 요소를 포함하여 새 리스트를 생성할 때 매우 유용합니다.
list_a = [1, 2, 3]
list_b = [4, 5, 6]
combined = [*list_a, *list_b, 7, 8]
print(combined) # [1, 2, 3, 4, 5, 6, 7, 8]
3. Double Asterisk(**)의 위력: 딕셔너리 언패킹
**는 오직 딕셔너리(Mapping) 타입을 위해 존재합니다. 딕셔너리의 키(Key)를 인자 이름으로, 값(Value)을 해당 인자의 값으로 변환하여 함수에 전달하거나 새로운 딕셔너리를 생성할 때 사용됩니다.
3.1 키워드 인자 전달
def introduce(name, age, city):
print(f"저는 {city}에 사는 {age}살 {name}입니다.")
user_info = {"name": "김파이", "age": 28, "city": "서울"}
# 딕셔너리 언패킹으로 함수 호출
introduce(**user_info)
3.2 딕셔너리 병합 및 업데이트
Python 3.5 버전부터는 **를 사용하여 여러 딕셔너리를 우아하게 병합할 수 있습니다. 만약 키가 중복된다면 뒤에 오는 딕셔너리의 값이 우선순위를 가집니다.
base_config = {"host": "localhost", "port": 8080}
user_config = {"port": 9000, "debug": True}
final_config = {**base_config, **user_config}
print(final_config) # {'host': 'localhost', 'port': 9000, 'debug': True}
4. 고급 활용: 가변 인자(Variadic Arguments) 정의
언패킹 연산자는 함수를 '호출'할 때뿐만 아니라 '정의'할 때도 사용됩니다. 이를 통해 인자의 개수가 정해지지 않은 유연한 함수를 설계할 수 있습니다.
| *args | Arguments | 위치 인자들을 튜플로 묶어서 받음 |
| **kwargs | Keyword Arguments | 키워드 인자들을 딕셔너리로 묶어서 받음 |
def multi_tasker(*args, **kwargs):
for arg in args:
print(f"위치 인자 처리: {arg}")
for key, value in kwargs.items():
print(f"키워드 인자 처리: {key} = {value}")
multi_tasker(1, 2, 3, action="upload", status="pending")
5. 실전 Sample Example: 데이터 파이프라인 구성
실무에서는 데이터베이스에서 가져온 레코드를 특정 클래스나 함수에 주입할 때 언패킹이 핵심적인 역할을 합니다.
# 데이터베이스에서 가져온 데이터라고 가정
db_row = ("Alice", "Engineer", 5000)
def create_profile(name, job, salary):
return {"user_name": name, "position": job, "income": salary}
# 위치 인자 언패킹으로 프로필 생성
profile = create_profile(*db_row)
# 추가 정보 업데이트 (딕셔너리 언패킹 병합)
additional_info = {"location": "New York", "active": True}
full_profile = {**profile, **additional_info}
print(full_profile)
6. 전문가의 조언 및 주의사항
- 가독성 우선: 언패킹은 편리하지만 과도하게 사용하면 데이터의 출처를 파악하기 어려울 수 있습니다. 변수명이 명확하지 않을 때는 주의하세요.
- 순서의 중요성: 딕셔너리 병합 시
{**old, **new}순서로 작성하면new의 값이old를 덮어씁니다. 의도한 업데이트 방향인지 확인이 필요합니다. - 타입 체크:
*는 모든 Iterable에 동작하지만**는 오직 매핑 객체(Mapping)에서만 동작합니다. 리스트에**를 사용하면TypeError를 보게 됩니다.
7. 결론
파이썬의 *와 ** 언패킹 연산자는 단순히 코드를 줄여주는 문법적 설탕(Syntactic Sugar) 그 이상입니다. 이는 동적인 인자 전달을 가능하게 하고, 데이터 구조 간의 결합도를 낮추며, 파이썬다운(Pythonic) 코드를 작성하게 하는 핵심 기법입니다. 이 강력한 연산자들을 숙달함으로써 여러분의 코드는 더욱 견고하고 유연해질 것입니다.
내용 출처
- Python Software Foundation: Official Python Tutorial - "Unpacking Argument Lists"
- PEP 448 – Additional Unpacking Generalizations
- Real Python: "Python's Asterisk (*) Operator: What You Need to Know"
- Effective Python by Brett Slatkin: "Item 22: Reduce Visual Noise with Variable Positional Arguments"
'Artificial Intelligence > 60. Python' 카테고리의 다른 글
| [PYTHON] 중첩 함수의 마법, nonlocal 키워드 완벽 가이드 : Closure와 상태 유지의 핵심 (0) | 2026.02.17 |
|---|---|
| [PYTHON] 파이썬 함수의 다중 반환값 마스터하기 : 튜플 패킹과 언패킹의 미학 (0) | 2026.02.17 |
| [PYTHON] 객체 지향의 시작, __init__ 메서드의 본질과 설계 철학 완벽 분석 (0) | 2026.02.17 |
| [PYTHON] 객체 지향의 나침반, self의 정체와 메커니즘 완벽 해부 (0) | 2026.02.17 |
| [PYTHON] 문서화 문자열(Docstring) 완벽 가이드 : 협업의 품격을 높이는 코드 기록 법 (0) | 2026.02.14 |