본문 바로가기

개발/Python

[Python] 아스테리스크(*) 연산자 알아보기

아스테리스크(*)는 다양한 용도로 사용된다. 그 중에서도 가장 많이 알려진 것인 C언어에서의 포인터로써 사용되는 것이나 곱셈 연산자로써 사용되는 것일 것이다.

파이썬(Python)에서도 * 연산자가 다양한 용도로 사용된다. 다른 언어들과는 다른 기능들을 알게 되어 정리해보려 한다.

1. 곱셈 연산자

a, b = 5, 3
a * b # 15

가장 많이 익숙한 방법이다. 두 수의 곱셈 연산을 할 때 사용된다.

2. 언팩(Unpacking)

언팩(Unpacking), 단어의 뜻 대로 쌓여있는 것을 푸는 용도로도 사용된다. 무슨 말인지는 예시를 통해 확인할 수 있다.

배열 a = [1, 2, 3, 4, 5]의 원소를 한 줄에 출력하는 코드를 통해 * 연산자의 언팩에 대해서 살펴본다.

 

언팩을 사용하지 않고 출력하는 방법으로 가장 먼저 떠오르는 방법은 반복문을 사용하는 방법이 있다.

a = [1, 2, 3, 4, 5]

for i in a:
    print(i, end=' ')
# 1 2 3 4 5

위 코드와 같이 반복문, 그리고 print의 end를 통해 한 줄로 결과를 출력할 수 있다.

 

a = [1, 2, 3, 4, 5]

print(*a)
# 1 2 3 4 5

언팩을 사용하면 반복문을 사용할 필요 없이 한 줄로 같은 기능을 수행할 수 있다.

* 연산자의 언팩 기능은 리스트(list) 또는 튜플(tuple)의 괄호([], ())를 벗겨내는 역할을 수행한다.

3. 패킹(Packing)

언팩 기능과 반대로 패킹 기능, 즉, 괄호로 묶는 기능 또한 수행할 수 있다. 이 경우, Kotlin에서 가변 인자를 `vararg`를 통해서 받는 것처럼 사용할 수 있다. 어떤 함수에 대해서 여러 개의 동일한 자료형의 매개 변수를 받는다고 했을 때, 여러 개의 변수를 두는 것이 아닌 하나의 가변 변수를 통해 함수에서 사용할 수 있도록 해주는 것이다.

def _sum(*numbers):
    print(numbers)
    return sum(numbers)
    
print(_sum(1, 2, 3, 4, 5)
# (1, 2, 3, 4, 5)
# 15

이 코드는 여러 개의 숫자를 받아 합을 반환하는 함수를 작성한 것이다. 중간에 들어간 print문은 패킹될 경우 어떻게 처리되는지를 확인하기 위해 넣은 코드이다.

 

_sum() 함수가 선언된 곳에서는 단 하나의 매개 변수 *numbers만 선언되어 있다. 하지만 실제 함수가 사용된 곳에서는 총 5개의 변수를 받았다. 입력된 5개의 변수는 * 연산자에 의해 튜플의 형태로 패킹된다. _sum 함수 내에 print문을 통해 확인할 수 있다. 패킹된 매개 변수들을 튜플의 형태로 되어 있기 때문에 sum 함수를 통해서 합을 구하는 것 또한 가능하다.

 

기본적으로 sum 함수가 구현되어 있지만, * 연산자의 패킹 기능을 확인하기 위해 이와 같은 코드를 작성해보았다.

이처럼, * 연산자는 가변 인자를 받아 하나의 iterable한 형태로 패킹하는 역할 또한 수행한다.

4. 변수의 할당

* 연산자를 통해 변수의 할당 또한 가능하다. 이 역시 코드를 보면 보다 쉽게 이해할 수 있다.

*a, b = [1, 2, 3, 0.11]

print(a) # [1, 2, 3]
print(b) # 0.11

두 개의 변수 a와 b를 할당하고 각 출력한 결과이다. 파이썬에서 기본적으로 하나의 변수에는 하나의 값이 할당되게 된다. 반면, * 연산자의 경우 여러 개의 값을 할당받을 수 있다. 따라서 위 코드에서는 마지막 1개의 원소를 제외한 1, 2, 3이 리스트의 형태로 a에 할당되고 b는 마지막으로 남은 0.11을 float형으로 할당받게 된다.

 

어디서 응용되는지 아직 사례를 만나지는 못했지만, 이런 방식으로 변수의 할당에도 * 연산자가 활용될 수 있다.


파이썬의 메소드들을 조회하다 보면, 또는 다른 사람들이 작성한 코드를 보다 보면 * 연산자를 사용해서 함수의 매개 변수를 사용하는 경우를 많이 봐왔다.

그 용도에 대해서 크게 궁금해한 적은 없었지만, 이렇게 공부를 하면서 * 연산자를 통해 보다 더 코드를 간결하게 작성할 수 있을 것 같다는 생각이 들면서, 그 동안 짜왔던 코드들의 리팩토링 또한 할 수 있을 것 같다는 생각이 들었다. 그리고, 다른 논문들에서 작성한 코드들에서 *가 있는 표현식에 대해서는 대충 '이런 느낌이구나'라고 생각하고 넘어갔었는데 보다 더 자세하게 코드 리뷰를 진행할 수 있을 것 같다.

반응형