인자 매개변수


함수는 마치 코드의 블랙박스와 같습니다.
함수의 작업을 의해서 기초 데이터 값을 전달해야 할 경우가 발생합니다. 이렇게 함수를 호출하는 데 필요한 기초 데이터 값을 전달해주는 것을 인자값이라고 합니다.

인자값은 함수에 임의의 값을 전달합니다. 인자 선언 방법은 함수 이름 다음에 오는 소괄호() 안에 필요한 기초 데이터 값을 나열하여 전달할 수 있습니다. 인자값은 직접 값을 넣을 수도 있지만 변수를 통하여 전달을 할 수도 있습니다.

함수 선언 문법

function 함수명 (인자1, 인자2, 인자3 ...) {
함수 정의 몸체 ... 
소스 코드 내용 
}

앞의 함수 선언부를 다시 한번 확인해 봅시다. 함수명 뒤에 괄호 () 부분이 있습니다.
함수명 뒤에는 꼭 괄호 () 부분이 같이 정의되는데 이 부분을 인자값을 지정하는 것입니다.
또한 함수 측면에서는 외부에서 들어오는 값을 매개변수라고 표현 합니다.

즉 함수가 처리를 하기 위한 데이터 값을 전달 하는 부분 입니다.
만일 전달하고자 하는 값이 여러 개인 경우에 콤마(,)로 구분하여 여러 개의 기초 데이터 값을 전달할 수 있습니다.

또한 함수는 처리 또는 호출 결과를 반환하여 이를 받아 다시 프로그램 실행에 필요한 처리를 할 수 있습니다.


매개변수 선언


함수는 외부로 들어오는 기초 데이터 값을 변수 형태로 입력받습니다.
외부에서 입력된 값을 전달받는 변수를 매개변수라고 합니다. 매개변수는 함수내에서 지역변수로 사용됩니다.

함수의 매개변수 선언는 소괄호 () 안에 인자값으로 받는 변수명을 넣으면 됩니다.

function hellowWorld ($name, $age) {
함수 정의 몸체 ... 
소스 코드 내용 

echo $name . <br>;

echo $age . <br>;
}

매개변수로 선언된 변수는 함수 몸체 안에서 별도의 선언 등을 하지 않고도 사용할 수 있습니다.
매개변수는 이미 함수 안에 정의 및 사용된 변수로 인식합니다.

인자로 전달되는 매개변수 데이터 값은 한 개 또는 여러 개를 사용할 수 있습니다.
만일 인자값이 다수일 때는 콤마(,)로 구분하여 여러 타입의 다수 데이터를 입력할 수 있습니다.
PSR 코딩 스타일 규칙에 따르면 변수명 뒤에는 공백 없이 콤마(,)를 추가하며 다음 번 변수명 사이에 공백을 하나 추가합니다.

어떤 함수들은 매개변수 인자가 없는 경우도 있을 수 있습니다.
단순 기능만 수행하는 함수들이 그럴 수 있는데, 이때 함수가 매개변수가 없더라도 선언할 때 중괄호 ()는 작성을 해야 합니다 (생략이 불가능하다고 생각하면 됩니다).

또한 함수를 호출할 때도, 인자값이 없는 함수는 호출할 때 꼭 소괄호 ()를 같이 붙여서 함수를 호출해야 합니다.


내부변수와 매개변수


함수의 매개변수로 선언된 변수의 이름은 약간의 독립된 변수입니다. 각각의 함수에 선언된 매개변수는 외부의 변수명과는 상관없습니다. 함수 밖에서 정의한 변수와 함수의 매개변수로 작성한 이름이 같다고 해서 동일한 변수는 아닙니다.

만일 동일한 함수를 두 번 이상 호출한다고 했을 때, 각각 호출할 때 생성된 변수들은 각각의 독립성을 가지고 있습니다. 1차 함수 호출 시 사용된 매개변수가 두 번째 호출될 때 영향을 주지 않습니다.

종종 우리는 코드에서 외부의 변수와 함수 안에 쓰이는 변수 이름이 같은 경우를 보는 경우가 있습니다. 이는 코드를 시각화로 편하게 하기 위해서 비슷한 이름을 사용하는 것이지 엄밀히 말하면 모두 각각 이름만 같은 다른 변수입니다.

내부변수와 매개변수가 다르다는 것은 함수의 호출에서 사용되는 변수와 함수 안에서 사용되는 변수가 서로 독립된 다른 변수라는 것입니다. 이 개념은 약간 혼동이 될 수도 있는데 이를 정확히 표현하는 명칭으로 함수를 호출할 때 이용하는 변수 이름을 실행 인자라고 부르고, 함수 안에서 받은 변수의 이름을 매개변수라고 표현을 구분하면 이해하기 더 쉬울 것입니다.

매개변수: 함수에서 인자값으로 받아 들이는 변수 값
실행 인자: 함수를 호출할 때 전달하는 값

예제 파일 func-05.php

<?php

$name = jiny;

function hellowWorld ($name, $age.) {
	echo $name . $age 입니다. <br>;
}

function setUserName ($name) {
	echo $name . <br>;
}

?>

위의 예를 보면 함수 외부에 선언되어 있는 $name 변수와 두 개의 함수의 매개변수로 선언된 $name 변수는 모두 각각의 다른 변수입니다.

함수 외부에 선언된 $name 변수는 hellowWorld 함수와 setUserName 함수에 있는 $name 변수는 다른 메모리 영역입니다. 또한 두 개의 함수에서도 외부에 선언된 $name 변수로 접근 할 수 없습니다.

또한 hellowWorld 함수의 $name 변수를 setUserName 함수에서 참조하거나 사용할 수도 없습니다.
즉 서로 다르게 분리된 변수라고 보면 됩니다.

이런 변수를 접근할 수 있는 권한을 각각이 분리하는 것은 절차적 프로그램과 함수 프로그램 간의 변수의 중복 및 처리에 대한 오류를 방지하기 위함입니다.


상수 실행 인자


함수를 호출할 때 전달되는 실행 인자값을 변수 형태 이외에 직접 값을 입력하는 상수 형태로도 전달할 수 있습니다.

실행 인자를 변수 형태가 아니라 상수값 형태로 전달하는 방식은 함수의 값을 테스트하거나, 직관적으로 데이터 값을 전달할 때 편리합니다. 또한 고정된 기능을 처리하는 함수를 만들 때 편리합니다.

예제 파일 func-06.php

<?php

	function hellowWorld ($name, $age) {
		echo $name ."는 $age입니다. <br>";
	}

	// 문자열 상수 실행 인자와, 정수형 상수 실행 인자를 전달합니다.
	hellowWorld("jiny", 20);

?>

결과

jiny는 20입니다.

위의 예제를 보면 hellowWorld 함수를 호출할 때 입력받는 함수의 매개변수 $name$age 값을 직접 문자열 및 정수로 데이터를 전달 합니다.


변수로 실행 인자 전달


상수값을 실행 인자로 전달하는 경우는 테스트 등의 작업 이외에는 별로 없습니다.
대부분 소스들은 데이터를 처리하고 값을 가공합니다. 또한 수많은 변수들을 통해 처리된 값들을 저장하고 실행 인자값으로 사용합니다. 변수로 실행 인자값을 전달한다는 표현은 함수 실행 시 호출하면서 상수값 형태로 전달하는 것과 달리 대부분은 변수에 데이터 값을 넣어서 값을 전달합니다.

예제 파일 func-07.php

<?php
	function addSum($x, $y) {
		$sum = $s + $y;
    	echo $sum."<br>";
	}

	// 변수에 값을 설정합니다.
	$x = 10;
	$y = 5;

	// 함수를 호출합니다.
	addSum($x, $y); 

	$value1 = 50;
	$value2 = 25;

	// 함수를 호출합니다.
	addSum($value1, $value2); 

?>

결과

5
25

위의 예제를 보면 addSum 함수는 두 개의 정수 값을 입력받아 합계를 구합니다. 함수 외부에 선언된 $x$y에 대입 연산자를 통해 값을 설정합니다.

함수 외부의 $x, $y와 함수 매개변수 $x, $y는 다른 변수입니다.
함수를 호출할 때 인자값을 변수로 대입하여 데이터를 전송합니다.

변수의 값은 같을 수도 있지만 정확한 의미로는,

addsum 함수의 $x 변수 = 함수 외부의 $x

값을 대입하여 전송하는 것과 같은 의미입니다.
즉, 함수 호출 시 입력하는 매개변수 값은 함수 내부의 변수에게 대입 연산을 하는 것과 같습니다.


매개변수 초기값


함수의 매개변수를 선언했을 경우 매개변수는 반드시 값을 지정하여 함수를 호출하는 것을 기본으로 합니다. 또한 PHP는 특성상 매개변수에 실행 인자값을 생략하여 호출할 수도 있습니다. 생략하거나 미지정된 매개변수 값을 함수 내에서 호출할 때 데이터 처리 오류가 발생할 수 있습니다.

이러한 점들을 미리 방지하기 위해서 PHP는 함수 매개변수를 선언할 때 초기값을 같이 선언을 할 수 있습니다.

만일 이러한 매개변수 초기값을 설정하는 기능이 없다면 함수 초기에 매개변수의 유효성을 체크하는 기능을 매번 만들어야 될 것입니다.
초기값 설정 기능을 통해 함수의 오동작을 줄여주고 함수의 매개변수 초기화 기능을 생략함으로써 소스의 코드를 줄일 수 있는 기능이 됩니다.

|문법|

function 함수명 (인자1=초기값) {
함수 정의 몸체 ... 
소스 코드 내용 
}

PHP의 매개변수의 초기값은 매우 직관적입니다.
매개변수를 선언할 때 변수명 = “기본값” 형태로 지정하면 됩니다.

예제 파일 func-08.php

<?php
function setHeight($minheight = 50) {
	echo "The height is : $minheight <br>";
}

// 함수 호출 시 매개변수 값 250을 입력합니다.
setHeight(250);

// 매개변수 값이 없습니다.
// 기본값 50이 적용됩니다.
setHeight();
?>

결과

The height is : 250
The height is : 50 

위의 예제를 보면 높이를 설정하는 사용자 함수가 있습니다. 본 함수는 매개변수를 선언할 때 = 50으로 초기값이 설정되어 있습니다.

함수를 호출할 때 매개변수 값을 입력하면 입력된 매개변수 값이 전달되어 화면에 출력됩니다.
하지만 매개변수 값을 입력하지 않고 호출하면 기본값으로 설정된 값으로 화면에 출력됩니다.

보통 함수를 선언하고 실행 호출을 할 때 매개변수의 개수와 형식을 유지하여 작성해야 합니다.
하지만 PHP는 함수에서 선언한 매개변수를 생략하여 호출할 수 있는 특징이 있습니다.
이렇게 생략 처리된 경우에는 초기값으로 전달됩니다.


타입 힌트

PHP는 변수의 타입을 특별히 지정하지 않아도 쓸 수 있는 유연한 언어입니다.
하지만 함수의 매개변수의 데이터 값을 입력받을 때 오류를 방지하고 정확한 값을 받고 싶을 경우에는 변수의 타입 힌트 기능을 통해 값의 유형을 지정할 수 있습니다.
변수명 앞에 입력받은 매개변수의 타입 힌트를 같이 정의함으로써 잘못된 값의 매개변수 입력을 사전에 필터링할 수 있습니다.

변수의 타입 힌트로 사용할 수 있는 형식은 다음과 같습니다:

  • Bool : 논리값
  • Float : 실수형 자료
  • Int : 정수형 자료
  • String : 문자열 자료

예제 파일 func-09.php

<?php
function test(int $x){
	echo $x."<br>";
}

echo test(1);

function test2(string $x){
	echo $x."<br>";
}

echo test2("문자열");

?>

결과

1
문자열

위의 예제에서 첫 번째 test(1); 은 실행 인자로 정수 값을 전달하고 함수도 타입 힌트를 통하여 정수 값을 받았기 때문에 오류 없이 입력한 정수 값을 출력합니다.

하지만 만일 타입이 틀린 형태 test("a");로 함수를 호출하는 경우에는 실행 인자가 문자열이고 입력 받는 매개변수의 타입이 정수이기 때문에 데이터 타입이 일치하지 않습니다. 이런 경우에는 PHP에서는 오류 메시지를 출력하게 됩니다.

C:\php-7.1.4-Win32-VC14-x86\jinyphp\func-22.php:2
Stack trace:
#0 C:\php-7.1.4-Win32-VC14-x86\jinyphp\func-22.php(8): test('a')
#1 {main}
thrown in C:\php-7.1.4-Win32-VC14-x86\jinyphp\func-22.php on line 2


참조 매개변수


C언어와 같은 low-Level 언어에는 매개변수로 인수의 참조(call by reference) 형태로 매개변수를 전달할 수 있습니다.
이를 또 다른 말로 참조에 의한 전달(passing by reference)이라고도 합니다.
PHP에서도 이와 같은 형태의 실행 인자 전달과 참조 매개변수를 선언하여 사용할 수 있습니다. C언어에서 포인터와 같은 개념이라고 생각하면 됩니다.

참조 매개변수는 변수명 앞에 & 기호를 붙여줍니다.

예제 파일 func-### 10.php

<?php
	function drink(&$name){
		$name = "사이다";
	}

	$drinkName = "콜라";
	echo "음료수 이름 = $drinkName <br>";

	drink($drinkName);
	echo "음료수 이름 = $drinkName <br>";

?>

결과

음료수 이름 = 콜라
음료수 이름 = 사이다 

위의 예를 보면 $drinkName 변수에는 콜라 값이 저장되어 있습니다.
이때 drink() 함수를 호출할 때 drink() 함수의 매개변수 인자는 입력받는 변수의 참조 주소 값으로 받습니다.
매개변수를 참조변수 형태로 받게 되면 drink() 함수의 $name 변수는 함수 외부에 있는 $drinkName 변수를 가리키게 됩니다.

즉, drink() 함수는 실행 인자로 전달된 변수의 주소를 참조하여 전달한 변수값 자체를 변경하게 됩니다.
그래서 두 번째 출력에서는 “사이다”로 변경되어 출력됩니다.


가변 매개변수


함수를 선언할 때 다수의 매개변수 인자값 선언을 했을 경우에 함수 호출도 동일한 수량의 인자값을 포함하여 함수를 호출해야 합니다.
모든 매개변수와 함수의 실행 인자의 개수는 한 쌍으로 맞추어 전달되게 됩니다.

함수를 선언할 때 매개변수의 개수는 선언 시 정의해야 합니다.
하지만 함수의 사용을 좀 더 유연적으로 처리하기 위해서 가변적으로 매개변수의 개수를 조절해야 하는 경우가 있습니다.
PHP언어는 가변 매개변수로 함수 정의와 호출 시 한 쌍씩 호출하는 규칙을 유연하게 처리를 할 수 있습니다.
즉, 함수의 정의된 매개변수의 개수보다 호출하는 인자의 수가 적어도 오류를 발생하기 않습니다.
매칭되지 않는 변수들은 NULL 또는 기본값으로 처리됩니다.

이러한 가변 매개변수를 이용하는 것은 좀 더 유연한 함수를 생성하고 처리하는 데 매우 유용합니다.

심지어 매개변수를 하나도 지정하지 않아도 함수에 매개변수를 전달할 수 있습니다. 이런 경우 함수를 실행할 때 매개변수의 개수를 확인할 수 있는 func_num_args() 내부 함수와 매개변수의 데이터를 배열로 가지고 올 수 있는 func_get_args() 내부 함수 두 개를 사용하여 처리할 수 있습니다.

예제 파일 func-11.php

<?php
function setting(){
	$num = func_num_args();
	echo "실행 인자 개수 = $num <br>";

	$args = func_get_args();
	foreach($args as $arg) echo $arg."<br>";
	
}

setting("aaa");
echo "====<br>";

setting("aaa","bbb");
echo "====<br>";

setting("aaa","bbb","ccc");
echo "====<br>";
?>

결과

실행 인자 개수 = 1
aaa
====
실행 인자 개수 = 2
aaa
bbb
====
실행 인자 개수 = 3
aaa
bbb
ccc
====

예제 파일 :func-12.php

<?php
function sum() {
	$a = 0;
	// func_get_args 함수를 통해 매개변수를 읽어옵니다.
	foreach (func_get_args() as $n) {
		$a += $n;
	}
	return $a;
}

echo sum(1, 2, 3, 4, 5);
?>

결과

15



가변 인자


가변 매개변수에서 func_get_args() 함수를 통해 입력되는 변수들을 배열로 입력 처리한 예를 보았을 것입니다.
PHP 5.6 이상의 버전에서는 와 같은 인수의 변수 번호 기능을 지원합니다.

함수가 가변 인자를 받을 목적으로 키워드를 포함할 수 있습니다. 키워드는 배열은 아니나 인수를 배열 형태로 전달됩니다.

키워드 가변인자는 함수의 인자값의 개수를 예측하기 어려울 때 매우 유용합니다.

예제 파일 scalar-13.php

<?php
// 가변 인자로 받습니다.
function sum(...$numbers) {
	$acc = 0;
	foreach ($numbers as $n) {
			$acc += $n;
	}
	return $acc;
}

echo sum(1, 2, 3, 4, 5);
?>

결과

15

위의 예에서 sum()함수는 가변 인자값으로 매개변수를 전달받습니다.
하지만 개수는 정의되지 않는다는 것입니다.

sum(1, 2, 3, 4, 5);처럼 여러 개의 값을 콤마(,)로 구분하여 다수의 인자값을 전달할 수 있습니다.
또한 전달된 인자값들은 가변변수 $numbers 로 받아 배열로 구분하여 각각의 값을 처리합니다.

예제 파일 scalar-14.php

<?php
function add($a, $b) {
	return $a + $b;
}

echo add(...[1, 2])."<br>";

$a = [4, 5];
echo add(...$a);
?>

결과

3
9

위의 add() 함수는 두 개의 값을 더하는 기능을 합니다.
함수 호출 시 배열 형태의 값으로 가변변수를 호출할 수도 있습니다.
또한 배열 변수를 가변변수의 인자값으로 전달할 수도 있습니다.