함수의 반환값


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

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


return 키워드


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

Function Return Concept Cartoon

그림: 로봇(함수)이 작업을 마치고 결과물(반환값)을 사용자에게 돌려주는 개념

문법

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 키워드는 제어 흐름상 여러 번 분기하여 호출할 수는 있으나, 한 번 실행될 때 돌려줄 수 있는 값 식별자는 오직 한 개뿐입니다. 아래 예시처럼 여러 변수를 쉼표로 나열하여 직접 반환하는 것은 PHP 문법상 불가능합니다.

return $aaa, $bbb; // ❌ 문법 에러 (Syntax Error)

만일 여러 개의 데이터를 한꺼번에 반환해야 한다면, 개별 값들을 배열(Array)이나 객체(Object)라는 하나의 바구니에 통째로 담아(Packing) 반환하는 기법을 사용해야 합니다. 반환받는 호출처에서는 리스트 구조분해 할당(Destructuring, [...]) 문법을 활용해 결합된 값을 개별 변수로 깔끔하게 풀어 받을 수 있습니다.

Single Value Return vs Multiple Values Return Flow Diagram

그림: 단일 값 반환(Single)과 배열/객체 패킹을 통한 다중 값 반환(Multiple)의 대조

예제:

<?php
// 두 변수의 값을 배열로 패킹하여 한 번에 돌려주는 함수
function getUserInfo() {
    $name = "홍길동";
    $age = 30;
    return [$name, $age]; 
}

// 호출 시 대괄호([, ]) 대입문을 써서 값을 개별 변수로 즉시 풀어 냅니다.
[$userName, $userAge] = getUserInfo();

echo "이름: {$userName}, 나이: {$userAge}"; // 출력: 이름: 홍길동, 나이: 30
?>

이 방식은 하나의 함수 호출로부터 다양한 상태값이나 연산 결과를 한꺼번에 안전하게 받아 활용할 수 있는 매우 유용한 기법입니다.


반환 데이터 타입 선언


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

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

[!NOTE] PHP 7.x 및 8.x 이상에서는 한 단계 나아가 void, never 같은 특수 반환 타입이나, 여러 반환 형식을 파이프로 연결하는 유니온 타입(Union Types) 등을 사용할 수 있습니다. 더 깊이 있고 엄격한 타입 지정을 학습하시려면 매개변수 및 반환값 타입 선언 페이지를 참고하시기 바랍니다.

만일 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() 함수로 바로 출력하여 확인을 합니다.



서브목차