PHP

25. PHP 매개변수와 인자

drizzle0925 2021. 3. 7. 12:55
728x90

매개변수(parameter)와 인자(argument)

함수의 매개변수(parameter)란 함수를 호출할 때 인자로 전달된 값을 함수 내부에서 사용할 수 있게 해주는 변수이다.

함수의 인자(argument)란 함수가 호출될 때 함수로 전달되는 값을 말한다.

함수는 다수의 매개변수가 있는 함수도 있고, 매개변수가 하나도 없는 함수도 존재한다.


매개변수의 전달 방식

함수의 매개변수에 값을 전달할 때는 다음과 같은 방식 중 하나를 선택할 수 있다.

 

1. 값 전달 방식

2. 참조 전달 방식


값 전달(passing by value)

기본적으로 함수의 인자는 값 전달(passing by value) 방식으로 매개변수를 전달한다.

 

인자를 함수에 전달하면, 새롭게 생성된 매개변수에 전달받은 값이 복사되어 저장된다.

복사되어 매개변수에 저장된 값은 함수 안에서 변경되어도 함수 밖의 데이터에는 영향을 주지 않는다.

 

1
2
3
4
5
6
7
8
9
10
<?php 
    function plus($parameter){
        return $parameter = $parameter + 1;
    }
 
    $argument = 1;
    echo "plus 함수의 값 : ".plus($argument);
    echo "<br>";
    echo "argument의 값 : {$argument}";
?>
cs

위의 예제에서 plus() 함수로 $argument를 전달하면 2라는 값을 리턴 받지만 $argument라는 변수의 값은 변하지 않았다는 것을 확인할 수 있다.


참조 전달(passing by reference)

함수 내부에서 함수 밖의 데이터를 조작하기 위해서는 해당 변수를 전역 변수(global)로 선언할 수도 있다.

하지만 참조 전달(passing by reference)을 이용하면 더욱 유연한 코드를 작성할 수 있다.

 

참조 전달은 인자로 전달받은 값을 복사하지 않고, 전달받은 원본 데이터를 매개변수로 전달한다.

참조 전달은 원본 데이터의 복사된 값을 가지는 것이 아니라 원본 데이터를 그대로 참조한다.

그래서 함수 내부에서 값을 변경하면, 함수 밖의 원본 데이터도 같이 바뀌게 된다.

 

참조 전달을 사용하기 위해서는 함수를 선언할 때 매개변수 앞에 '&'라는 기호를 붙여주면 된다.

 

1
2
3
4
5
6
7
8
9
10
<?php 
    function plus(&$parameter){ // 매개변수 앞에 &를 붙여준다
        return $parameter = $parameter + 1;
    }
 
    $argument = 1;
    echo "plus 함수의 값 : ".plus($argument);
    echo "<br>";
    echo "argument의 값 : {$argument}";
?>
cs

 

참조 전달 방법으로 인해 $argument의 값도 변화된 것을 확인할 수 있다.


기본 매개변수(default parameter)

디폴트 매겨변수란 함수를 호출할 때 명시된 매개변수를 전달하지 않았을 경우에 사용하게 될 기본값을 의미한다.

함수를 호출할 때 함수의 정의에서 명시된 매개변수의 수만큼 인자를 전달하지 않으면 에러가 발생한다.

하지만 기본 매개변수를 설정하면, 함수 호출 시 전달할 인자의 수를 유연하게 설정할 수 있다.

 

기본 매개변수는 매개변수에 대입 연산자(=)를 이용하여 값을 넣어주면 된다.

 

1
2
3
4
5
6
7
8
9
<?php 
    // 함수정의
    function sum($left$right = 5) { // 매개변수에 값을 대입해준다
        return $left + $right;
    }
    
    // 함수 호출
    echo sum(10);
?>
cs

 

위에 예제에서 $left에는 반드시 값을 전달받아야 하지만, $right는 전달받지 않아도 된다.

$right에 값이 전달되지 않을 경우 자동으로 5라는 값을 이용한다.

 

PHP에서 함수를 호출할 때 전달된 인수를 매개변수의 왼쪽부터 차례대로 대입된다.

따라서 $right에 값을 전달하려면 먼저 $left에 값을 전달해야만 한다.

이 때문에 기본 매개변수의 설정은 맨 오른쪽 끝부터 설정해야 한다.

 

 

1
2
3
4
5
6
7
8
9
<?php 
    // 함수정의
    function sum($left$right = 5) { // 매개변수에 값을 대입해준다
        return $left + $right;
    }
    
    // 함수 호출
    echo sum(1030);
?>
cs

인자를 제대로 넘겨주면 기본값을 사용하지 않는다.

 

 

기본 매개변수를 왼쪽부터 대입했을 경우를 보자

 

1
2
3
4
5
6
7
8
9
10
11
<?php 
    // 함수정의
    function sum($left = 5$right) { // 매개변수에 값을 대입해준다
        return $left + $right;
    }
    
    // 함수 호출
    echo sum(1030); // 문제 없음
    echo "<br>";
    echo sum(10); // 에러 발생
?>
cs

인자(argument)가 너무 적다는 에러를 발생시킨다.

sum(10)의 경우 $left에만 인자를 전달한 것으로 해석된다.

$right에는 인자가 전달되지 않았고 기본 매개 변숫값도 없으므로 에러가 발생한다.


가변 길이 인자 목록(variable-length argument list)

가변 길이 인자 목록은 함수를 선언할 때 전달받을 인자의 개수를 미리 정하지 않고, 호출할 때마다 유동적으로 인자를 넘기는 기능이다.

 

PHP 5.5 이하에서는 func_num_args(), func_get_arg(), func_get_args() 함수를 사용하여 설정할 수 있다.

하지만 PHP 5.6 이상에서는 '..."토큰을 사용하여 간편하게 설정할 수 있다.

 

 

PHP 5.5 이하에서 가변 길이 인수 목록을 설정하는 예제

 

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php 
    // 함수정의
    function sum() {
        $sum = 0;
        foreach(func_get_args() as $n){
            $sum = $sum + $n;
        }
        return $sum;
    }
    
    // 함수 호출
    echo sum(1,2,3); // 1+2+3 = 6
?>
cs

func_get_args() 함수는 sum() 함수가 호출될 때 전달된 인수들을 배열의 형태로 반환해준다.

따라서 sum() 함수 내부에서는 매개변수 대신에 func_get_args() 함수를 통해 인자에 접근할 수 있다.

그러므로 sum() 함수가 호출될 때 전달되는 인수의 개수에 신경 쓸 필요가 없어진다.

 

 

www.php.net/manual/ja/function.func-get-args.php

 

PHP: func_get_args - Manual

"Because this function depends on the current scope to determine parameter details, it cannot be used as a function parameter. If you must pass this value, assign the results to a variable, and pass the variable."This means that the following code generate

www.php.net

func_get_args - 함수의 인수 리스트를 배열로 반환한다.

즉, 함수에 넘기는 인자 값을 배열 값으로 리턴하는 함수이다.

 

 

1
2
3
4
5
6
7
8
9
<?php 
    // 함수정의
    function argumentCheck() {
        var_dump(func_get_args());
    }
    
    // 함수 호출
    argumentCheck(4,5,6);
?>
cs

 

 

PHP 5.6 이상에서 가변 길이 인자 목록을 설정하는 예제

 

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php 
    // 함수정의
    function sum(...$value) {
        $sum = 0;
        foreach($value as $n){
            $sum = $sum + $n;
        }
        return $sum;
    }
    
    // 함수 호출
    echo sum(1,2,3); // 1+2+3 = 6
?>
cs

PHP 5.6 이상부터는 '...'토큰을 사용하여 함수가 호출될 때 전달받은 인수들을 배열 형태로 저장할 수 있다.

따라서 sum() 함수 내부에서는 배열 $value를 이용하여 전달받은 인자에 접근할 수 있다.

728x90