5-2 매개변수와 인자: 위치, 기본값, 키워드 인자

5-2 매개변수와 인자: 위치, 기본값, 키워드 인자

← 목차로 돌아가기

썸네일

함수를 정의할 줄 알게 되면 자연스럽게 다음 질문이 따라옵니다. “이 함수에 값을 넘기는 방법이 하나뿐일까?” 파이썬은 함수에 값을 전달하는 방식을 꽤 유연하게 열어두고 있습니다. 순서대로 값을 넘길 수도 있고, 값을 생략하면 미리 정해둔 기본값이 쓰이게 할 수도 있고, 이름을 붙여서 순서와 상관없이 넘길 수도 있습니다.

이번 챕터에서는 이 세 가지 방식, 즉 위치 인자, 기본값 인자, 키워드 인자를 하나씩 살펴보고, 이들을 함께 쓸 때 지켜야 할 순서 규칙까지 정리해보겠습니다.

핵심 요약

매개변수는 함수를 정의할 때 값을 받기 위해 정해두는 이름이고, 인자는 함수를 호출할 때 그 이름에 실제로 전달하는 값입니다. 위치 인자는 순서대로 전달되고, 기본값 인자는 값을 생략해도 미리 지정한 값이 쓰이며, 키워드 인자는 매개변수 이름을 직접 지정해 순서에 상관없이 값을 전달합니다. 이 세 가지를 함께 쓸 때는 위치 인자 → 기본값 인자 → 키워드 인자 순서를 지켜야 하며, 이를 어기면 SyntaxError가 발생합니다.

매개변수와 인자, 이름표와 내용물

매개변수(parameter)는 함수를 정의할 때 “이 함수는 이런 값을 받는다”라고 미리 정해두는 변수 이름입니다. 인자(argument)는 함수를 호출할 때 그 매개변수에 실제로 넘기는 값입니다. 택배에 비유하면 매개변수는 상자에 붙은 받는 사람 이름표이고, 인자는 상자 안에 실제로 들어있는 물건이라고 생각하면 이해가 쉽습니다.

이 코드가 하는 일: name이라는 매개변수를 받는 함수를 정의하고, “이순신”이라는 인자를 넘겨 호출합니다.

def greet(name):
    print(f"안녕하세요, {name}님!")

greet("이순신")

# 출력 결과
# 안녕하세요, 이순신님!

여기서 name은 greet 함수의 매개변수이고, "이순신"은 함수를 호출할 때 전달한 인자입니다. 매개변수는 함수 안에서만 쓰이는 변수 이름일 뿐이므로, 함수 밖에서 name이라는 변수를 따로 만들어도 서로 영향을 주지 않습니다.

위치 인자: 순서대로 값 전달하기

가장 기본적인 방식은 위치 인자입니다. 함수를 호출할 때 넘긴 값이 매개변수가 정의된 순서 그대로 대응됩니다. 순서가 바뀌면 결과도 완전히 달라지므로 주의가 필요합니다.

이 코드가 하는 일: 이름과 나이를 순서대로 전달받아 소개 문장을 출력합니다.

def introduce(name, age):
    print(f"{name}님은 {age}살입니다.")

introduce("김유신", 32)
introduce(32, "김유신")  # 순서를 바꾸면 의미가 뒤바뀝니다

# 출력 결과
# 김유신님은 32살입니다.
# 32님은 김유신살입니다.

두 번째 호출처럼 순서를 바꾸면 문법 오류는 나지 않지만 의도한 결과와 전혀 다른 값이 나옵니다. 매개변수가 많아질수록 순서를 헷갈리기 쉬워지는데, 이 문제를 줄여주는 것이 바로 뒤에서 볼 키워드 인자입니다.

기본값 인자: 값을 생략할 수 있게 하기

매개변수에 기본값을 지정해두면, 호출할 때 해당 인자를 생략해도 함수가 오류 없이 그 기본값을 사용합니다. 자주 같은 값을 넘기게 되는 매개변수에 유용합니다.

이 코드가 하는 일: greeting 매개변수에 기본값 “안녕하세요”를 지정해, 값을 넘기지 않아도 동작하게 합니다.

def greet(name, greeting="안녕하세요"):
    print(f"{greeting}, {name}님!")

greet("강감찬")                # 기본값 사용
greet("강감찬", "반갑습니다")   # 기본값 대신 직접 전달

# 출력 결과
# 안녕하세요, 강감찬님!
# 반갑습니다, 강감찬님!

흔한 오류: 기본값 인자는 뒤쪽에 와야 한다

기본값이 없는 매개변수 뒤에 기본값이 있는 매개변수를 두는 것은 괜찮지만, 그 반대는 SyntaxError가 됩니다. 파이썬 입장에서는 어디까지가 생략 가능한 값인지 애매해지기 때문입니다.

이 코드가 하는 일: 기본값 매개변수를 기본값 없는 매개변수보다 앞에 두면 함수 정의 단계에서 바로 오류가 납니다.

def greet(greeting="안녕하세요", name):
    print(f"{greeting}, {name}님!")

# 출력 결과
# SyntaxError: non-default argument follows default argument

즉 def greet(name, greeting="안녕하세요")처럼 값이 필수인 매개변수를 먼저 쓰고, 생략 가능한 매개변수를 뒤에 배치해야 합니다.

키워드 인자: 이름으로 값 전달하기

키워드 인자는 매개변수명=값 형태로 호출하는 방식입니다. 순서와 상관없이 어떤 값이 어떤 매개변수로 가는지 명확해지기 때문에, 매개변수가 여러 개일 때 코드의 의도를 훨씬 읽기 쉽게 만들어줍니다.

이 코드가 하는 일: 매개변수 이름을 직접 지정해 순서를 바꿔서 호출해도 같은 결과가 나오는 것을 보여줍니다.

def introduce(name, age):
    print(f"{name}님은 {age}살입니다.")

introduce(name="김유신", age=32)
introduce(age=32, name="김유신")  # 순서를 바꿔도 결과는 동일

# 출력 결과
# 김유신님은 32살입니다.
# 김유신님은 32살입니다.

키워드 인자는 특히 기본값 매개변수가 여러 개일 때 유용합니다. 앞쪽 매개변수는 그대로 두고 뒤쪽 매개변수 하나만 바꾸고 싶을 때, 순서를 신경 쓸 필요 없이 이름으로 콕 집어 전달하면 되기 때문입니다.

위치 인자와 키워드 인자 함께 쓰기

위치 인자와 키워드 인자를 한 호출에서 섞어 쓸 수도 있습니다. 다만 규칙이 하나 있는데, 위치 인자는 반드시 키워드 인자보다 앞에 와야 합니다. 이 순서가 지켜지지 않으면 파이썬이 어떤 값을 어디에 넣어야 할지 판단할 수 없기 때문입니다.

이 코드가 하는 일: 첫 번째 값은 위치로, 나머지는 이름으로 전달합니다.

def introduce(name, age, city="서울"):
    print(f"{name}님은 {age}살, {city}에 삽니다.")

introduce("김유신", age=32, city="경주")  # 정상: 위치 → 키워드 순서

# 아래처럼 순서를 뒤집으면 오류가 납니다
introduce(name="김유신", 32, city="경주")

# 출력 결과
# 김유신님은 32살, 경주에 삽니다.
# SyntaxError: positional argument follows keyword argument

정리하면 함수를 호출할 때는 위치 인자를 먼저 쓰고, 그 뒤에 키워드 인자를 쓴다는 순서만 기억하면 됩니다. 함수를 정의할 때는 기본값 없는 매개변수를 먼저, 기본값 있는 매개변수를 뒤에 두는 것과 짝을 이루는 규칙입니다.

키워드 인자가 가독성을 살리는 순간

키워드 인자의 진짜 장점은 매개변수 개수가 늘어날수록, 특히 값이 True/False처럼 의미가 바로 와닿지 않는 값일수록 뚜렷해집니다. 위치 인자만으로 호출하면 나중에 코드를 다시 볼 때 각 값이 무엇을 의미하는지 함수 정의를 다시 찾아봐야 하는 경우가 많습니다.

이 코드가 하는 일: 같은 호출을 위치 인자와 키워드 인자로 각각 작성해 가독성 차이를 비교합니다.

def send_message(text, urgent=False, log=True):
    prefix = "[긴급] " if urgent else ""
    print(f"{prefix}{text}")
    if log:
        print("(전송 기록 저장됨)")

# 위치 인자만 쓰면 True/False가 각각 무엇을 뜻하는지 바로 알기 어렵습니다.
send_message("서버 점검 안내", True, False)

# 키워드 인자를 쓰면 값의 의미가 코드에 그대로 드러납니다.
send_message("서버 점검 안내", urgent=True, log=False)

# 출력 결과
# [긴급] 서버 점검 안내
# [긴급] 서버 점검 안내

두 호출은 결과가 똑같지만, 두 번째 방식은 urgent=True, log=False라는 이름 자체가 설명을 대신해줍니다. 매개변수가 세 개 이상이거나 값이 숫자·불리언처럼 의미를 바로 알기 어려운 함수라면, 키워드 인자를 적극적으로 쓰는 편이 나중에 코드를 읽는 사람(자기 자신 포함)에게 훨씬 친절합니다.

실전 예제: 옵션이 많은 함수 설계하기

회원 프로필을 만드는 함수처럼, 필수 값은 적고 선택적으로 지정할 값이 많은 함수를 만들 때 세 가지 방식을 함께 활용하면 효과적입니다. 이름만 있으면 기본값으로 동작하되, 필요할 때만 원하는 항목을 콕 집어 바꿀 수 있게 설계할 수 있습니다.

이 코드가 하는 일: 필수 매개변수 name은 위치로, 나머지 선택 항목은 기본값과 키워드 인자로 처리합니다.

def create_profile(name, age=None, city="미정", is_public=True):
    age_text = f"{age}살" if age is not None else "나이 비공개"
    visibility = "공개" if is_public else "비공개"
    print(f"{name} / {age_text} / {city} / {visibility} 프로필")

create_profile("이순신")
create_profile("이순신", age=45, city="아산")
create_profile("이순신", is_public=False, city="아산")

# 출력 결과
# 이순신 / 나이 비공개 / 미정 / 공개 프로필
# 이순신 / 45살 / 아산 / 공개 프로필
# 이순신 / 나이 비공개 / 아산 / 비공개 프로필

세 번째 호출에서는 age는 그대로 기본값을 쓰고, city와 is_public만 키워드 인자로 골라 바꿨습니다. 이렇게 필수 값과 선택 값을 구분해 설계해두면, 함수를 쓰는 쪽에서 필요한 옵션만 골라 넘기면 되므로 호출 코드가 훨씬 간결해집니다.

자주 묻는 질문 (FAQ)

Q. 매개변수와 인자를 꼭 구분해서 불러야 하나요?

A. 코드 동작에는 영향이 없지만, 함수를 정의할 때 쓰는 이름은 매개변수, 호출할 때 넘기는 값은 인자로 구분해 부르면 다른 사람과 소통할 때나 공식 문서를 읽을 때 훨씬 수월합니다.

Q. 기본값 인자는 함수를 호출할 때마다 다시 계산되나요?

A. 아닙니다. 기본값은 함수가 정의되는 시점에 딱 한 번 만들어지고 계속 재사용됩니다. 이 때문에 리스트나 딕셔너리처럼 값이 바뀔 수 있는 자료형을 기본값으로 쓰면 예상치 못한 동작이 생길 수 있어 주의가 필요합니다.

Q. 위치 인자와 키워드 인자 중 어떤 걸 써야 하나요?

A. 매개변수가 한두 개고 순서가 명확할 때는 위치 인자로 충분합니다. 매개변수가 여러 개이거나 기본값 매개변수 일부만 바꾸고 싶을 때는 키워드 인자를 쓰면 코드의 의도가 더 분명해집니다.

Q. 모든 매개변수에 기본값을 주면 인자 없이도 호출할 수 있나요?

A. 네, 모든 매개변수에 기본값이 있다면 인자를 하나도 넘기지 않고 함수 이름만으로 호출할 수 있습니다.

Q. 키워드 인자에 없는 매개변수 이름을 쓰면 어떻게 되나요?

A. 함수 정의에 없는 이름으로 키워드 인자를 전달하면 TypeError가 발생합니다. 매개변수 이름의 철자를 정확히 맞춰야 합니다.

Q. 같은 매개변수에 값을 두 번 전달하면 어떻게 되나요?

A. introduce("김유신", name="이순신")처럼 위치 인자와 키워드 인자가 같은 매개변수를 동시에 채우려 하면 TypeError: got multiple values for argument가 발생합니다. 한 매개변수는 한 번만 값을 받을 수 있습니다.

마무리하며

매개변수는 함수가 받을 값의 이름표, 인자는 그 이름표에 실제로 담기는 값이라는 기본 구분만 잡히면 나머지는 자연스럽게 따라옵니다. 위치 인자로 순서대로 전달하고, 기본값 인자로 생략을 허용하고, 키워드 인자로 이름을 명시하는 세 가지 방식을 상황에 맞게 조합하면 함수를 훨씬 유연하게 설계할 수 있습니다. 처음에는 세 방식을 굳이 구분해서 써야 하나 싶을 수 있지만, 매개변수가 서너 개를 넘어가는 함수를 만들다 보면 왜 이 조합이 필요한지 금방 체감하게 됩니다. 다음 챕터에서는 함수가 작업 결과를 밖으로 돌려주는 방법, return과 None에 대해 살펴보겠습니다.

참고 자료

  1. Python 공식 튜토리얼 — 함수 정의, 기본값 인자, 키워드 인자: https://docs.python.org/ko/3/tutorial/controlflow.html
  2. Python 용어집 — parameter(매개변수) / argument(인자): https://docs.python.org/ko/3/glossary.html
  3. Python 표준 라이브러리 — 내장 함수: https://docs.python.org/ko/3/library/functions.html

#파이썬매개변수와인자, #파이썬키워드인자사용법, #파이썬기본값인자, #파이썬위치인자순서, #파이썬함수인자오류, #파이썬함수, #매개변수, #인자, #파이썬기초, #파이썬입문

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다