이 글의 작성자는 C/C++ 프로그래밍을 하던 사람이다. 이 글은 Python을 복습하며 작성하는 글이니, 부족한 부분이 있으면 얼마든지 피드백을 주시기 바란다.

 

매개변수(parameter) vs 인자(argument)

함수를 다루다보면 매개변수라는 말과 인자라는 말을 들을 수 있다. 그리고 이 말을 혼용해서 사용하는 경우도 종종 볼 수 있다. 하지만 엄연히 따지고 보면 두 단어는 차이가 있는 단어이다.

매개변수(parameter)는 함수에 선언되어서 호출할 때 값을 받아들이는 변수이다.

인자(argument)는 함수를 호출할 때 전달하는 값이다.

 

다음 코드를 통해 무엇이 매개변수이고 인자인지 알아보자. 지난번에 살펴봤던 더하기 함수이다.

def plus(a,b):
    return a+b

plus(2,3)

위의 코드에서 각각 매개변수와 인자는 무엇일까?

매개변수는 plus 함수 선언에 있는 ab다.

인자는 plus 함수를 호출할 때 쓰는 23이다.

 

위와 같이 엄연히 차이가 있긴 하지만, 함수의 괄호 안에 들어간다는 공통점 때문인지는 몰라도, 인자와 매개변수를 혼용해서 사용한다고 해도 생각보다 혼란이 오지는 않는다. 다만 정확히 알아둬서 나쁠건 없다. 이 내용은 기억할 수 있으면 기억하고 넘어가자.

 

함수의 인자 두 종류

Python에서 사용할 수 있는 인자는 두 종류가 있다. 더하기 함수를 예시로 해서 알아보도록 하자. 여기서 매개변수 ab의 값이 무엇인지 확인하는 코드를 추가해보자.

def plus(a,b):
    print(a,b)
    return a+b

 

위치 인자 (positional argument)

우리가 지금까지 써 오던 인자다. 인자를 각각의 위치에 맞는 매개변수에 복사한다. 당장 매개변수와 인자의 차이를 설명하던 코드를 그대로 사용해보자.

plus(2,3)

그러면 a와 b의 값이 각각 2와 3이 나오는 것을 확인할 수 있다.

매개변수는 ab의 순서대로 선언되어 있다. 그리고 plus 함수를 호출할 때, 2와 3의 순서대로 집어넣었다. 제일 먼저 들어간 2는 제일 먼저 선언된 매개변수 a에 들어갔고, 그 다음으로 들어간 3은 그 다음으로 선언된 매개변수 b에 들어갔다.

즉, 인자는 매개변수가 선언된 순서대로 들어갔다라고 할 수 있다. 만약 2와 3의 위치가 바뀌었다면, a에는 3이 들어갔을 것이고, b에는 2가 들어갔을 것이다. 인자가 들어간 위치가 중요하므로, 위치 인자라고 불리는 것이다.

 

키워드 인자 (keyword argument)

그리고 Python에는 키워드 인자라는 것이 있다. 이렇게 생겼다.

plus(a=2, b=3)

대충 살펴보면 plus 함수의 매개변수에 직접 값을 대입하고 있는 것 처럼 보인다.

맞다. 직접 집어넣는 것이다. 그리고 위의 코드로 호출하면 ab의 값이 각각 2와 3이 나오는 것을 확인할 수 있다.
그러면 위치를 바꿔도 그렇게 나올까?

plus(b=3, a=2)

위의 코드를 실행해도 여전히 a는 2, b는 3이 나오는 것을 확인할 수 있다.

사실 리스트의 정렬을 할 때 키워드 인자를 한 번 사용한 적이 있다. 오름차순/내림차순을 결정할 때 어떻게 했었는지 다시 한번 생각해보자.

 

위치 인자와 키워드 인자를 같이 쓴다면

위치 인자와 키워드 인자를 같이 쓸 수도 있다.

plus(2, b=3)

위의 코드를 실행하면 a는 2, b는 3이 나오는 것을 확인할 수 있다. 그러면 이번에도 위치를 바꿔도 될까?

plus(b=3, 2)

그러면 다음 에러를 볼 수 있을 것이다.

SyntaxError: positional argument follows keyword argument

직역하자면, 위치 인자가 키워드 인자 다음에 나왔다라는 에러가 발생하고 있다. 즉, 키워드 인자를 사용하기 시작했으면 키워드 인자만 계속 써야 한다. 그 뒤로 위치 인자가 나오면 에러다.

그러면 이렇게 쓰는건 어떨까?

plus(2, a=3)

위치 인자를 먼저 사용했고, 마지막으로 키워드 인자를 사용했으니 문제가 없어 보일 수 있으나, 이것 또한 에러다. 어떤 에러가 발생하는지 확인해보자.

TypeError: plus() got multiple values for argument 'a'

a에 다수의 값이 들어가고 있다는 에러를 확인할 수 있다.

2는 위치 인자이기 때문에 맨 처음 선언된 매개변수 a에 들어간다. 거기에 키워드 인자로 a를 지정하고 3을 대입하고 있기 때문에, Python은 “그래서 a에다 뭘 집어넣으란거야?” 라는 말을 하고 있는 것이다.

사실 위와 같은 함수에서 일부러 위치 인자와 키워드 인자를 섞어서 사용할 일이 얼마나 있을지는 잘 모르겠다. (본인은 C/C++을 주로 하던 사람이기 때문이다)
하지만 다음에 알아볼 내용에서는 섞어서 쓸 일이 생길 것 같다.

 

Categories:

Updated:

Comments