함수의 아규먼트와 파라미터
1. 파라미터와 아규먼트란?
함수의 아규먼트(argument)와 파라미터(parameter)는 프로그래밍에서 함수를 정의하고 호출할 때 중요한 개념이며 구분해야 하는 용어입니다. 이 용어에 대한 개념과 들어갈 수 있는 다양한 형태를 예제를 통해 알아보도록 하겠습니다.
1.1 파라미터 (Parameter)
파라미터는 함수를 정의할 때 사용되는 변수입니다. 파라미터는 함수가 호출될 때 들어온 값을 변수에 할당하는 역할을 합니다.
def my_function(x, y):
return x + y
def my_function(x, y):
return x + y
위 코드에서 x
와 y
는 파라미터입니다.
1.2 아규먼트 (Argument)
아규먼트는 함수를 호출할 때 전달하는 실제 값입니다. 이 값들은 함수 호출 시 파라미터에 할당됩니다.
result = my_function(5, 3)
result = my_function(5, 3)
위 코드에서 5
와 3
은 아규먼트입니다.
1.3 파라미터와 아규먼트 예시
기본적으로는 함수를 정의할 때 설정된 파라미터의 수와, 함수 호출 시 전달되는 아규먼트의 수가 일치해야 합니다. 다만 앞으로 배울 기본값이 설정된 파라미터는 아규먼트에서 값을 입력할 필요가 없을 수 있습니다.
1.3.1 파라미터의 기본 사용
함수 f
는 3개의 파라미터 a
, b
, c
를 가집니다. 함수 호출 시, 키워드 인자(keyword arguments) 를 사용하여 원하는 파라미터에 값을 할당할 수 있습니다.
1.3.2 기본값을 가진 파라미터
a
, b
, c
각각의 파라미터에 기본값을 설정했습니다. 기본값이 설정된 파라미터는 함수 호출 시 생략할 수 있습니다. 함수 호출 시 기본값이 아닌 다른 값을 사용하려면 새 값을 전달해야 합니다.
1.3.3 일부 파라미터만 기본값을 가지는 경우 (잘못된 예)
파이썬에서는 기본값이 없는 파라미터가 기본값을 가진 파라미터 뒤에 올 수 없습니다. 이 코드는 오류를 발생시킵니다.
1.3.4 일부 파라미터만 기본값을 가지는 경우 (올바른 예)
해당 예제는 b
와 c
파라미터에 기본값을 설정했으며, a
는 기본값이 없습니다. 기본값이 없는 파라미터에는 반드시 값을 전달해야 합니다.
이 예제는 a
파라미터에 기본값이 없으며, b
와 c
에는 기본값이 설정되어 있습니다. 함수 호출 시, a
파라미터에는 반드시 값을 전달해야 합니다.
1.4 나아가기
1.4.1 컨벤션 자료형을 아규먼트로 넣었을 때
아래와 같이 함수를 만들어 호출하게 되면 외부에 있는 a 변수가 영향을 받게 됩니다.
위와 같은 코드는 함수 안에서 동작할 때 아래와 같은 화살표를 가지고 있습니다. id로 주소값을 찍어보면 같은 곳을 가리키고 있다는 것을 확인할 수 있습니다. 주소값을 출력하는 것은 여러분과 저의 출력결과가 다릅니다. 두 개의 출력 결과가 같은지만 확인해주세요.
따라서 my_list에 append는 a의 append와 같습니다.
그렇다면 아래와 같은 코드는 어떻게 해서 a가 10이 안되었는지 확인해보도록 하겠습니다.
이는 아래와 같은 화살표로 표시될 수 있습니다.
1.4.2 권장하지 않는 기본값
파이썬에서 함수의 기본값은 함수가 정의될 때만 한 번 평가됩니다. 이것은 리스트와 같이 변경 가능한 객체를 기본값으로 사용할 때 문제가 될 수 있습니다.
# 권장하지 않는 방법
def append_to_list(value, lst=[]):
lst.append(value)
return lst # 예상치 못한 결과가 발생할 수 있습니다.
# 권장하지 않는 방법
def append_to_list(value, lst=[]):
lst.append(value)
return lst # 예상치 못한 결과가 발생할 수 있습니다.
위의 방법은 권장되지 않습니다. lst=[]
라는 기본값은 함수가 정의될 때 한 번만 생성되고, 같은 리스트 객체가 모든 함수 호출에 대해 공유됩니다. 이 때문에 리스트가 변경될 때마다 (즉, 함수가 호출될 때마다) 변경된 내용이 유지되며, 이는 다음과 같은 예상치 못한 결과를 초래할 수 있습니다.
append_to_list(1) # 출력: [1]
append_to_list(2) # 출력: [1, 2], 그러나 결과가 [2]가 나올것으로 예상할수 도 있습니다.
append_to_list(1) # 출력: [1]
append_to_list(2) # 출력: [1, 2], 그러나 결과가 [2]가 나올것으로 예상할수 도 있습니다.
권장 방법은 다음과 같습니다.
# 권장 방법
def append_to_list(value, lst=None):
if lst is None:
lst = []
lst.append(value)
return lst
# 권장 방법
def append_to_list(value, lst=None):
if lst is None:
lst = []
lst.append(value)
return lst
이 방법은 lst
파라미터의 기본값을 None
으로 설정하고, 함수 본문 내에서 None
값을 새로운 리스트로 바꾸어 주어, 함수 호출 사이에 리스트가 공유되지 않도록 합니다. 이렇게 하면, 각 함수 호출이 독립적인 리스트를 가지게 되므로, 위에서 설명한 예상치 못한 부작용을 피할 수 있습니다.
append_to_list(1) # 결과: [1]
append_to_list(2) # 결과: [2]
append_to_list(1) # 결과: [1]
append_to_list(2) # 결과: [2]
이러한 방법은 함수 호출 간에 상태를 공유하지 않아야 하는 경우, 특히 기본값이 변경 가능한 객체일 때 유용합니다.