매개변수와 인수
매개변수(parameter)와 인수(argument)
함수의 매개변수(parameter)란 함수를 호출할 때 인수로 전달된 값을 함수 내부에서 사용할 수 있게 해주는 변수입니다.
또한, 함수의 인수(argument)란 함수가 호출될 때 함수로 값을 전달해주는 변수를 가리킵니다.
대부분의 함수는 하나 이상의 매개변수를 가지며, 매개변수가 없는 함수도 존재합니다.
매개변수의 전달 방식
함수로 전달된 인수에 저장된 값을 매개변수에 전달할 때는 다음 방식 중 하나를 선택할 수 있습니다.
1. 값 전달 방식
2. 참조 전달 방식
값 전달(passing by value)
기본적으로 함수의 인수는 값 전달(passing by value) 방식으로 매개변수로 전달됩니다.
인수를 함수에 전달하면, 새롭게 생성된 매개변수에 전달받은 값이 복사되어 저장됩니다.
이처럼 매개변수에 저장된 값은 전달받은 데이터의 복사본으로, 함수 안에서 변경되어도 함수 밖의 원본 데이터에는 영향을 주지 않습니다.
예제
function increment($para)
{
$para++; // $value의 값을 복사하여 increment() 함수에 인수로 전달함.
}
$value = 1;
increment($value);
위의 예제에서 매개변수 $para는 함수가 호출될 때 생성되며, 전달받은 값인 1을 2로 증가시킵니다.
하지만 함수 밖에 존재하는 변수 $value의 값은 변하지 않습니다.
참조 전달(passing by reference)
함수 내부에서 함수 밖의 데이터를 조작하기 위해서는 해당 변수를 전역 변수로 선언할 수도 있습니다.
하지만 참조 전달(pass by reference)을 이용하면 더욱 유연한 코드를 작성할 수 있습니다.
참조 전달은 인수로 전달받은 값을 복사하는 것이 아닌, 전달받은 원본 데이터에 대한 참조 변수를 매개변수에 전달합니다.
따라서 참조 전달은 원본 데이터의 복사된 값을 가지는 것이 아니라 원본 데이터를 그대로 참조하게 됩니다.
그래서 함수 내부에서 값을 변경하면, 함수 밖의 원본 데이터도 같이 바뀌게 됩니다.
참조 전달을 사용하기 위해서는 함수를 선언할 때 매개변수 앞에 '&'기호를 붙여주면 됩니다.
예제
function increment(&$para) // 인수로 전달되는 값의 원본을 참조함.
{
$para++;
}
$value = 1;
increment($value);
위의 예제에서는 참조 전달 방식을 사용하였기 때문에 함수 밖에 존재하는 변수 $value의 값이 같이 변경되었습니다.
디폴트 매개변수(default parameter)
디폴트 매개변수란 함수를 호출할 때 명시된 매개변수를 전달하지 않았을 경우에 사용하게 될 기본값을 의미합니다.
함수를 호출할 때 함수의 정의에서 명시된 매개변수의 수만큼 인수가 전달되지 않으면, PHP 파서는 오류를 발생시킵니다.
하지만 디폴트 매개변수를 설정하면, 함수 호출 시 전달할 인수의 수를 유연하게 설정할 수 있습니다.
PHP에서 디폴트 매개변수는 매개변수의 이름과 함께 대입 연산자(=)를 이용하여 설정할 수 있습니다.
예제
function sum($value1, $value2 = 0, $value3 = 0)
위의 예제에서 변수 $value1은 인수로 반드시 전달받아야 하지만, 나머지 두 개의 매개변수는 만약 전달받지 못하면 설정된 기본값을 사용하게 됩니다.
PHP에서 함수를 호출할 때 전달된 인수는 매개변수의 왼쪽부터 차례대로 대입됩니다.
따라서 매개변수 $value3에 값을 전달하려면, 먼저 매개변수 $value1과 $value2에 값을 전달해야만 합니다.
이 때문에 디폴트 매개변수의 설정은 매개변수 리스트의 맨 오른쪽 끝 매개변수부터 시작해야 합니다.
다음 예제는 sum() 함수의 매개변수 중 2개의 매개변수에 디폴트 매개변수를 설정하는 예제입니다.
예제
function sum($value1, $value2 = 0, $value3 = 0)
{
return $value1 + $value2 + $value3;
}
echo sum(1, 2, 3); // 6
echo sum(1, 2); // 3
echo sum(1); // 1
//echo sum(); // 오류가 발생함.
다음 예제는 sum() 함수의 매개변수 중 2개의 매개변수에 디폴트 매개변수를 설정하는 예제입니다.
예제
function sum($value1 = 0, $value2, $value3 = 0)
{
return $value1 + $value2 + $value3;
}
① echo sum(1, 2, 3); // 6
② echo sum(1, 2); // 3
③ //echo sum(1); // 오류가 발생함.
④ //echo sum(); // 오류가 발생함.
위의 예제는 앞선 예제와는 달리 디폴트 매개변수를 매개변수 리스트의 양 끝의 매개변수만 설정합니다.
이렇게 설정하면 ①번 라인과 같이 3개의 인수를 모두 전달하는 경우와 ②번 라인과 같이 2개의 인수를 전달하는 경우에만 정상적으로 동작하게 됩니다.
③번과 ④번 라인에서는 PHP 파서가 인수로 전달되지 않은 두 번째 매개변수의 값을 특정할 수 없으므로, 오류를 발생시킵니다.
가변 길이 인수 목록(variable-length argument list)
가변 길이 인수 목록은 함수를 선언할 때 전달받을 인수의 개수를 미리 정하지 않고, 호출할 때마다 유동적으로 인수를 넘기는 기능입니다.
PHP 5.5 이하에서는 func_num_args(), func_get_arg(), func_get_args() 함수를 사용하여 설정할 수 있었습니다.
하지만 PHP 5.6 이상에서는 '...' 토큰을 사용하여 간편하게 설정할 수 있습니다.
다음 예제는 PHP 5.5 이하에서 가변 길이 인수 목록을 설정하는 예제입니다.
예제
function sum()
{
$sum = 0;
foreach(func_get_args() as $n) { // PHP 5.5 이하
$sum += $n;
}
return $sum;
}
위의 예제에서 func_get_args() 함수는 sum() 함수가 호출될 때 전달된 인수들을 배열의 형태로 반환해 줍니다.
따라서 sum() 함수 내부에서는 매개변수 대신에 func_get_args() 함수를 통해 인수에 접근할 수 있습니다.
그러므로 sum() 함수가 호출될 때 전달되는 인수의 개수에 신경 쓸 필요가 없어집니다.
다음 예제는 PHP 5.6 이상에서 가변 길이 인수 목록을 설정하는 예제입니다.
예제
function sum(...$num) // PHP 5.6 이상
{
$sum = 0;
foreach($num as $n) {
$sum += $n;
}
return $sum;
}
PHP 5.6 이상부터는 위의 예제처럼 '...' 토큰을 사용하여 함수가 호출될 때 전달받은 인수들을 배열 형태로 저장할 수 있습니다.
따라서 sum() 함수 내부에서는 배열 $num를 이용하여 전달받은 인수에 접근할 수 있습니다.