이 문서의 과거 버전 (r1)을 보고 있습니다. 수정일: 2026.02.22 09:15
함수나 메서드, 프로시저와 같은 서브루틴을 호출할 때 그 동작에 필요한 데이터를 전달하기 위해 사용되는 값이나 변수를 인수라고 한다. 인수는 호출하는 쪽에서 실제로 전달하는 값이며, 이를 받는 서브루틴 내부에서는 매개변수라는 이름으로 참조된다. 이는 함수가 다양한 상황에서 재사용될 수 있도록 하는 핵심 메커니즘이다.
인수의 주요 유형으로는 반드시 제공해야 하는 필수 인수, 매개변수 이름을 지정하여 순서에 상관없이 전달할 수 있는 키워드 인수, 인수를 생략했을 때 사용될 기본값이 미리 정의된 기본값 인수, 그리고 개수가 정해지지 않은 여러 값을 전달할 수 있는 가변 인수 등이 있다. 이러한 다양한 유형은 함수의 인터페이스를 유연하고 표현력 있게 만든다.
함수에 인수를 전달하는 방식은 프로그래밍 언어마다 다르며, 크게 값에 의한 호출과 참조에 의한 호출로 구분된다. 이러한 전달 방식은 함수 내부에서 인수의 값을 변경할 수 있는지 여부에 직접적인 영향을 미친다. 인수의 개념은 함수형 프로그래밍부터 객체 지향 프로그래밍에 이르기까지 모든 프로그래밍 패러다임에서 기본이 되며, API 설계의 근간을 이룬다.
함수를 정의할 때 괄호 안에 선언되는 변수를 형식 인수라고 한다. 이는 함수가 호출될 때 전달받을 값의 자리 표시자 역할을 하며, 함수 본문 내에서 지역 변수처럼 사용된다. 반면 함수를 실제로 호출할 때 괄호 안에 넣어 전달하는 구체적인 값이나 변수를 실인수라고 부른다.
함수가 실행되면 실인수의 값이 형식 인수에 대입된다. 예를 들어, 함수 정의 def add(a, b)에서 a와 b는 형식 인수다. 이 함수를 add(5, x)와 같이 호출하면, 실인수 5와 변수 x의 값이 각각 형식 인수 a와 b에 전달된다. 이 과정을 통해 함수는 외부에서 주어진 데이터를 처리할 수 있게 된다.
형식 인수와 실인수의 개수와 자료형은 일반적으로 일치해야 한다. 많은 프로그래밍 언어는 함수 시그니처를 통해 이를 검사한다. 그러나 파이썬의 키워드 인수나 기본값 인수처럼 순서를 다르게 지정하거나 생략할 수 있는 유연한 매커니즘을 제공하는 경우도 있다.
이 두 개념을 명확히 구분하는 것은 함수의 인터페이스를 이해하고 API를 올바르게 사용하는 데 중요하다. 형식 인수는 함수의 청사진을, 실인수는 그 청사진에 맞춰 실제로 사용하는 재료를 의미한다고 볼 수 있다.
값에 의한 호출은 함수나 메서드를 호출할 때 실인수의 값을 복사하여 형식 인수에 전달하는 방식이다. 이 방식에서는 호출하는 측의 변수와 호출받는 함수 내의 매개변수가 서로 다른 메모리 공간을 가지게 된다. 따라서 함수 내부에서 매개변수의 값을 변경하더라도, 호출 시 전달한 원본 변수의 값에는 아무런 영향을 미치지 않는다.
이 방식은 원본 데이터의 무결성을 보장해야 할 때 유용하다. 함수가 실인수의 복사본만을 다루기 때문에, 의도치 않게 원본 데이터가 수정되는 부작용을 방지할 수 있다. 많은 프로그래밍 언어에서 기본적인 인수 전달 방식으로 채택하고 있으며, 특히 C 언어와 Java의 기본 자료형 전달이 대표적인 예이다.
그러나 값에 의한 호출은 대규모 구조체나 객체를 인수로 전달할 때는 비효율적일 수 있다. 인수의 전체 데이터를 복사해야 하므로 메모리 사용량과 실행 시간이 증가할 수 있기 때문이다. 이러한 경우에는 참조에 의한 호출이나 포인터를 이용한 간접 전달 방식을 고려한다.
가변 인수는 함수나 메서드를 호출할 때, 미리 정해진 개수가 아닌 임의의 개수의 인수를 전달할 수 있도록 하는 기능이다. 이는 동일한 연산을 여러 개의 데이터에 적용해야 할 때, 인수 목록을 유연하게 구성할 수 있어 코드의 재사용성과 가독성을 높여준다. 많은 현대 프로그래밍 언어에서 이 기능을 지원하며, 함수 정의 시 특별한 문법을 사용하여 구현한다.
구현 방식은 언어마다 차이가 있다. 예를 들어, 파이썬에서는 인수명 앞에 별표(*args)를 붙여 튜플 형태로 여러 개의 위치 인수를 받는다. 자바에서는 메서드 선언부에 줄임표(...)를 사용하여 배열로 가변 인수를 처리한다. C 언어에서는 <stdarg.h> 헤더 파일에 정의된 매크로 함수들을 활용하여 가변 인수 목록에 접근한다.
가변 인수를 사용할 때는 주의가 필요하다. 함수 내부에서 전달된 인수의 개수와 자료형을 적절히 검사하지 않으면 런타임 오류가 발생할 수 있다. 또한, 디버깅이 어려워질 수 있고, 과도하게 사용하면 함수의 의도를 파악하기 힘들어질 수 있다. 따라서 정해진 개수의 인수로 처리할 수 있는 경우에는 명시적인 매개변수를 사용하는 것이 바람직하다.
함수나 메서드를 정의할 때, 각 인수는 특정 자료형을 가질 수 있다. 이는 함수가 기대하는 데이터의 종류를 명시하여, 잘못된 타입의 값이 전달될 경우 컴파일 시점이나 런타임에 오류를 발생시켜 프로그램의 안정성을 높이는 역할을 한다. 예를 들어, 정수를 처리하는 함수에 문자열이 전달되면 문제가 발생할 수 있으므로, 자료형을 지정함으로써 이러한 오류를 사전에 방지할 수 있다.
많은 정적 타입 언어에서는 함수 선언 시 각 매개변수의 자료형을 명시적으로 선언한다. 반면 동적 타입 언어는 자료형을 명시하지 않는 경우가 많지만, 함수 내부에서 전달받은 인수의 타입을 검사하는 코드를 작성하여 유연성을 확보하기도 한다. 제네릭 프로그래밍이나 템플릿을 지원하는 언어에서는 인수의 자료형을 일반화하여, 여러 타입에 대해 동작하는 하나의 함수를 작성할 수 있다.
인수의 자료형은 함수의 다형성과도 깊은 연관이 있다. 함수 오버로딩을 지원하는 언어에서는 동일한 함수 이름에 대해 서로 다른 자료형의 인수 목록을 가진 여러 버전의 함수를 정의할 수 있다. 이때 컴파일러나 인터프리터는 호출 시 전달된 실인수의 자료형을 분석하여 알맞은 함수 버전을 선택해 실행한다.
함수를 정의할 때 그 함수가 받아들일 입력의 이름을 매개변수라고 한다. 반면에 함수를 실제로 호출할 때 전달하는 구체적인 값이나 변수를 인수라고 한다. 이 둘은 함수의 입력을 가리키지만, 정의 시점과 호출 시점이라는 맥락에 따라 구분된다.
예를 들어, def add(a, b):와 같은 함수 정의에서 a와 b는 매개변수이다. 이 함수를 add(5, 10)과 같이 호출할 때, 숫자 5와 10이 바로 인수에 해당한다. 매개변수는 함수 내부에서 사용되는 지역 변수의 이름 역할을 하며, 인수는 그 매개변수에 대입될 실제 값을 제공한다.
이 차이는 함수형 프로그래밍이나 객체지향 프로그래밍을 막론하고 모든 프로그래밍 패러다임에서 공통적으로 적용되는 기본 개념이다. 컴파일러나 인터프리터는 함수 호출 시 인수의 값을 매개변수에 복사하거나 연결하는 방식으로 함수 호출을 처리한다.
따라서 매개변수는 함수의 청사진이나 틀을 구성하는 형식적 요소라면, 인수는 그 틀에 맞춰 실제 연산을 수행하기 위해 채워 넣는 구체적인 데이터라고 볼 수 있다. 이 구분을 명확히 이해하는 것은 API 설계나 다른 개발자가 작성한 라이브러리를 올바르게 사용하는 데 중요하다.