함수의 반환값


함수는 특정처리를 하는 블랙박스와 같다고 앞에서 설명을 했습니다. 입력값이 있으면 그에 상응하는 결과값이 있을 수도 있습니다. 함수는 입력받은 매개변수처럼 함수가 특정한 작업 처리한 후에 결과 값이 있을 경우에 반환할 수 있습니다.

실제적으로 함수를 작성하는 것은 어떠한 처리를 동작시키는 것뿐만 아니라 처리 결과를 얻기 위해서 많이 사용합니다.
또한 동작만 하는 경우에도 동작의 처리 결과의 성공 여부를 알려주기 위해서도 논리 반환값으로 많이 사용합니다.


return 키워드


함수의 데이터 처리 후에 값을 반환하기 위해서는 return이라는 키워드를 사용합니다. return의 사전적인 의미를 보면 ‘돌아오다’, ‘돌아가다’라는 의미를 가지고 있습니다. 함수가 실행 도중에 return 키워드를 만나게 되면 실행하는 함수의 처리를 중단하고 함수를 호출한 위치로 제어권을 돌려줍니다.

문법

return 반환값;

return 키워드 다음에 반환할 값 또는 변수를 적으면 됩니다.
이때 return문 다음에 값을 같이 정의하여 함수의 처리 결과를 호출한 제어권의 위치에 값을 전달합니다.

반환으로 사용할 수 있는 변수 타입의 제한은 없습니다. 정수, 문자열, 어레이, 객체 등 다양한 형태의 변수를 반환할 수 있습니다.
심지어 상수나 논리값을 직접 쓰거나, 함수에서 처리한 변수를 적을 수도 있습니다.

호출한 함수의 반환값을 받기 위해서는 대입 연산자를 이용하면 됩니다.
즉, 함수를 호출하게 되면 호출된 위치에서 함수의 제어권이 변경되고 함수를 처리하게 됩니다.
또한 return 반환문을 받으면 함수를 호출한 코드의 라인과 그 위치에 값이 반환되기 때문에 반환값을 변수에 대입하게 됩니다.
따라서 반환값을 얻기 위해서는 함수의 호출과 함께 데이터를 받을 변수에 대입하는 형태로 작성해야 합니다.

문법

$변수 = 함수명();

즉, 함수를 실행 후 반환되는 값을 대입 연산자를 통하여 변수에 반환값을 저장하게 됩니다.

만일 반환값을 변수에 대입하지 않고 함수의 반환값을 처리할 수도 있습니다.
함수 처리의 성공 여부를 나타내는 논리값 같은 경우가 대표적입니다.

예제)

if(함수명()){
} else {
}

위의 문법 예처럼 if 조건문 안에 바로 함수를 넣어서 작성할 수도 있습니다.
만일 반환값이 1보다 큰 의미 있는 값일 경우에는 참 조건을 실행하고 반환값이 0이거나 NULL 일 경우에는 거짓 부분을 실행합니다.

모든 함수는 반환 반환 키워드 return을 만나면 데이터 값을 반환함과 동시에 함수 종료의 의미를 가지고 있습니다.
반환값을 가지고 실행 제어권이 함수 호출 위치로 돌아가게 됩니다.

예제 파일 func-15.php

<?php
	function sum($x, $y) {
		$z = $x + $y;
		return $z;
	}

	echo "5 + 10 = " . sum(5, 10) . "<br>";
	echo "7 + 13 = " . sum(7, 13) . "<br>";
	echo "2 + 4 = " . sum(2, 4);

?>

결과

5 + 10 = 15
7 + 13 = 20
2 + 4 = 6

다음 예제는 함수의 인자값을 전달하여 비교 판단 후 결과를 반환합니다.
sum() 함수는 두 개의 인자값을 매개변수로 받아서 값을 합산한 후에 결과값을 돌려줍니다.
예제의 echo 명령에서처럼 함수의 반환값을 변수나 조건문 등을 사용하지 않고도 바로 화면으로 출력할 수 있습니다.

예제 파일 func-16.php

<?php
// 성인 여부를 판별하는 함수를 하나 생성합니다.
// 인수로는 나이 값 변수 하나를 전달합니다.
function is_adult($age){
	if($age>=18){
		return true;
	} else {
		return false;
	}
}

$memAge = 20;

if (is_adult($memAge)) {
	echo "성인입니다.";
} else {
	echo "미성년입니다.";
}
?>

결과

성인입니다.


복수 데이터 반환


함수에서 return 키워드는 여러 번 사용할 수는 있으나, return 키워드를 이용하여 반환할 수 있는 값은 한 개의 데이터만 반환할 수 있습니다.
다음처럼은 사용할 수가 없습니다.

return $aaa, $bbb; 

만일 여러 개의 데이터를 반환하기 위해서는 객체 또는 배열을 통해 반환하면 복수의 데이터를 반환 받아 처리할 수 있습니다.
이것은 반환하는 변수는 한 개이나 변수의 특성상 배열과 객체는 여러 개의 데이터를 포함하고 있기 때문입니다.


반환 데이터 타입 선언


PHP언어의 장점이라면 C언어처럼 함수를 반환할 때 데이터 타입을 지정하지 않아도 됩니다.
PHP에서는 함수에서 return으로 반환하는 변수의 타입으로 데이터가 반환됩니다.
즉, 변수의 값이 정수이면 정수로 반환되고, 논리값이면 논리변수 타입으로 반환하게 됩니다.

이러한 PHP의 유연한 변수 타입 설정으로 인해 함수의 반환값의 타입을 엄격하게 정하여 사용하지는 않았습니다.
하지만 PHP 7.x로 버전이 올라가면서 PHP도 함수의 반환 데이터의 타입을 지정할 수 있게 되었습니다.
만일 7.x 이상의 버전을 사용하고 좀 더 반환되는 타입을 엄격하게 지정하고 싶다면 다음과 같이 반환 타입을 함수 선언 시에 정의할 수 있습니다.

문법

function 함수명(인자1, 인자2, ... ) : 반환 데이터 타입 {
	함수내용...
}

함수 선언 시에 함수 인자값 괄호 () 뒤에 콜론과 반환 데이터 타입을 선언하면 됩니다.
함수로부터 반환되는 데이터 타입은 기존 PHP에서 사용 가능한 데이터 타입 리스트를 따릅니다.

예제 파일 func-17.php

<?php

function arraysSum(array ...$arrays): array {
	return array_map(
		function(array $array): int {
			return array_sum($array);
		}
		, 
		$arrays
	);
}

print_r(
	arraysSum(
		[1,2,3],
		[4,5,6],
		[7,8,9]
	)
);

?>

결과

Array ( [0] => 6 [1] => 15 [2] => 24 ) 

위의 예제는 2차원 배열의 인자값을 받아서 각각의 서버 1차 배열 간의 합계를 구한 후에 1차원 배열값을 반환합니다.
이때, 함수 선언부에 반환되는 데이터 값이 배열(array)로 설정되어 있습니다.

반환하는 데이터와 반환 데이터 타입이 일치하지 않은 경우에는 PHP에서 오류를 발생합니다.
반환받은 1차원 배열을 print_r() 함수로 바로 출력하여 확인을 합니다.