본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 파이썬 유연함의 극치 : Asterisk(*)와 Double Asterisk(**) 언패킹 완벽 가이드

by Papa Martino V 2026. 2. 17.
728x90
Asterisk(*)와 Double Asterisk(**) 언패킹
Asterisk(*)와 Double Asterisk(**) 언패킹

 

파이썬 프로그래밍을 하다 보면 함수 정의나 호출부, 혹은 리스트와 딕셔너리를 다룰 때 *(Asterisk)와 **(Double Asterisk) 기호를 자주 마주하게 됩니다. 단순히 곱셈이나 거듭제곱 연산자로만 알고 있다면, 파이썬이 제공하는 '가장 강력하고 우아한 도구' 중 하나인 언패킹(Unpacking) 기능을 놓치고 있는 것입니다. 언패킹은 반복 가능한(Iterable) 객체에 담긴 요소를 개별 인자로 풀거나, 여러 데이터를 하나의 구조로 병합할 때 사용됩니다. 본 가이드에서는 코드의 가독성을 비약적으로 높여주고 복잡한 데이터 구조를 단순하게 처리해주는 *** 연산자의 모든 것을 전문적으로 파헤쳐 봅니다.


1. Asterisk(*)와 Double Asterisk(**)의 정의와 차이

파이썬에서 언패킹 연산자는 크게 두 가지로 분류됩니다. 핵심은 '어떤 데이터 타입을 다루는가'에 있습니다.

*Single AsteriskList, Tuple, Set, String 등반복 가능한 객체의 요소를 개별 인자로 전개
**Double AsteriskDictionary (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) 정의

언패킹 연산자는 함수를 '호출'할 때뿐만 아니라 '정의'할 때도 사용됩니다. 이를 통해 인자의 개수가 정해지지 않은 유연한 함수를 설계할 수 있습니다.

*argsArguments위치 인자들을 튜플로 묶어서 받음
**kwargsKeyword 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"
728x90