개발하는 두부

[PHP] 기본 문법 정리 (4) (feat. 함수)

by 뚜부니

PHP

1. 함수

1.1. 함수

함수란 하나의 특별한 목적의 작업을 수행하도록 설계된 독립적인 블록을 의미합니다.

함수를 사용하면 하나의 로직을 재실행 할 수 있도록 하기 때문에 코드의 재사용성을 높여줍니다.

또한, 프로그램을 여러 개의 함수로 나누어 작성하면 모듈화로 인해 전체적인 코드의 가독성이 좋아집니다.

그리고 프로그램에서 버그가 발생할 여지를 줄여주며, 유지보수를 쉽게 할 수 있습니다.

1.2. 함수의 구조

일반적으로 함수의 구조는 다음과 같습니다. return은 필요에 따라 존재할 수도 있고 존재하지 않을 수도 있어요!

function 함수명 (매개변수1, 매개변수2, ...) {
    함수가 호출되었을 때 실행될 코드;
    return 반환값;
}

1.3. 사용자 정의 함수

PHP에서는 미리 작성되어 제공되는 많은 내장 함수들이 있습니다. 이에 대한 내용은 아래에 정리해두었습니다!

이미 많은 내장 함수들이 있찌만 필요로 하는 기능을 가진 함수가 없다면, 직접 함수를 만들 수도 있습니다.

이렇게 직접 만든 함수를 사용자 정의 함수라고 합니다.

위에 정리된 함수의 구조를 그대로 정의하여 사용합니다.

function 함수명 (매개변수1, 매개변수2, ...) {
    함수가 호출되었을 때 실행될 코드;
    return 반환값;
}

PHP에서 함수의 이름을 작성해야 할 때 준수해야 할 사항이 있습니다!

  1. 함수의 이름은 문자와 숫자, 언더스코어(_)만 사용할 수 있다.
  2. 함수의 이름은 숫자로 시작할 수 없다.
  3. 여러 함수가 같은 이름을 사용할 수 없다.

PHP는 함수 오버로딩을 지원하지 않아서 이미 선언된 함수는 재선언이 불가합니다!

또한, 대소문자를 구분하지 않아요!!!! 그렇지만 선언한 그대로 호출하는 것이 좋습니다!

1.4. 함수의 호출과 반환

1.4.1. 함수의 호출

PHP가 미리 정의하여 제공하는 함수는 모든 PHP 스크립트에서 호출(사용)할 수 있습니다.

그러나 사용자 정의 함수는 해당 함수가 정의된 PHP 스크립트에서만 호출할 수 있습니다.

또한, PHP의 모든 함수와 클래스는 전역 범위를 가집니다.

따라서 같은 스크립트 내에서는 함수가 내부에서 정의되었더라도 외부에서 호출할 수 있습니다.

반대로 외부에서 정의되었어도 내부에서 호출할 수 있습니다.

<?php
function number() {
    for ($i = 1; $i < 11; $i++) {
        echo $i." ";
    }
}

number();
?>

1부터 10까지 출력하는 함수를 만들어보았습니다! 실행 결과는 아래와 같아요.

함수를 호출 할 때 매개변수를 함께 보내는 법은 다음과 같습니다.

<?php
function number_sum($a, $b) {
    echo $a + $b;
}

number_sum(2, 4);
?>

함수에서 요구한대로 매개변수 두 개를 보냈더니 다음과 같이 두 매개변수의 합을 화면에 출력해주네요.

1.4.2. 함수의 반환

함수는 값을 반환할 수도 있습니다. return을 사용하면 함수 호출에 대한 값을 반환해줍니다.

위에서 두 수를 더하는 함수를 만들었는데, 함수 내부에서 화면에 출력하는 것이 아닌 함수 밖에서 출력해볼까요?!

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

echo "함수 실행 결과: ".number_sum(2, 4);
?>

코드를 실행시켜보면 아래와 같이 함수에서 값을 반환하는 것을 확인할 수 있습니다.

PHP 7부터는 반환값을 원하는 타입으로 받을 수 있습니다.

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

var_dump(number_sum(2, 4));
?>

위의 코드를 수행시켜보면 int 형으로 반환됩니다.

🙋‍♀️ int형이 아니라 string형으로 반환되면 좋겠어요!!

그렇다면 원하는 반환값을 함수 뒤에 : 타입 을 붙이면 됩니다.

<?php
function number_sum($a, $b):string {
    return $a + $b;
}

var_dump(number_sum(2, 4));
?>

결과를 보면 string으로 정상적으로 넘어온 것을 확인할 수 있습니다.

위의 방식은 약한 강도이기 때문에 자동으로 타입을 변환해 명시된 타입으로 변환하여 반환합니다.

하지만 강한 강도에서는 반환값의 타입이 일치하지 안으면 오류가 발생합니다.

강한 강도로 지정하고 싶다면 declare(strict_types = 1); 을 함수 위에 추가하면 됩니다.

위에서 사용한 코드를 강한 강도로 지정해볼까요?!

<?php
declare(strict_types=1);
function number_sum($a, $b):string {
    return $a + $b;
}

var_dump(number_sum(2, 4));
?>

이렇게 강한 강도로 지정하면 자동으로 string으로 변환해주는 것이 아닌 에러 발생으로 인해 페이지가 작동하지 않는 것을 확인할 수 있습니다.

코드 상의 에러를 확인해보면 타입이 달라서 발생한 오류임을 확인할 수 있습니다!

강한 강도로 지정하려면 코드를 작성할 때 더 생각을 많이 하고 짜야할 것 같네요..!! 🤫🤫

1.5. 매개변수와 인수

매개변수(parameter)와 인수(argument)는 혼용해서 써서 저도 많이 헷갈리는 표현이에요 😂😂

이번에 한 번 제대로 정리하고 넘어가볼게요! 😊😊

매개변수 : 함수를 호출할 때 인수로 전달된 값을 함수 내부에서 사용할 수 있게 해주는 변수
인수 : 함수가 호출될 때 함수로 값을 전달해주는 변수

대부분의 함수는 하나 이상의 매개변수를 가지며, 매개변수가 없는 함수도 존재합니다!

1.5.1. 값에 의한 호출 (Call by Value)

기본적으로 함수는 호출 시 인수를 전달하는 형태로 이뤄지며,

이 때 새롭게 생성된 매개변수에 전달받은 값이 복사되어 저장됩니다.

그렇기 때문에 함수 안에서 매개변수 값이 변경되어도 외부의 변수 값에 영향을 주지 않아요.

<?php
function increment($num) {
    $num++;
    echo "함수 내부 : ".$num."<br />";
}
$num = 5;
increment($num);
echo "함수 실행 후 (외부) : ".$num;
?>

코드를 통해 확인해보면 실행 전 값이 아무런 영향을 주지 않았음을 확인할 수 있습니다.

1.5.2. 참조에 의한 호출 (Call by Reference)

그렇다면 참조에 의한 호출 방식은 어떨까요?

이 방식은 인수로 전달받은 값을 복사하는 것이 아닌, 전달받은 원본 데이터에 대한 참조 변수를 매개변수에 전달합니다.

그렇기 때문에 함수 내부에서 값이 바뀌면 외부에서도 값이 바뀌게 됩니다.

매개변수 앞에 & 기호를 붙여서 인수를 전달받으면 됩니다!

<?php
function increment(&$num) {
    $num++;
    echo "함수 내부 : ".$num."<br />";
}
$num = 5;
increment($num);
echo "함수 실행 후 (외부) : ".$num;
?>

이전 코드에서 매개변수 앞에 &만 붙였을 뿐인데, 결과가 바뀐 걸 확인할 수 있습니다!

1.5.3. 디폴트 매개변수

디폴트 매개변수란!

함수를 호출할 때 명시된 매개변수를 전달하지 않았을 경우 사용하게 될 기본값을 의미합니다.

함수를 호출할 때 함수의 정의에서 명시된 매개변수 수만큼 인수가 전달되지 않으면 오류가 발생하는데,

디폴트 매개변수를 설정하면 호출 시 전달할 인수의 수를 유연하게 설정할 수 있어요! 😄😄

<?php
function number_sum($num1, $num2 = 0, $num3 = 0) {
    return $num1 + $num2 + $num3;
}
echo number_sum(1, 2, 3)."<br/>";
echo number_sum(1, 2)."<br/>";
echo number_sum(1)."<br/>";

?>

이렇게 전달하는 인수의 수가 매개변수의 수와 다르지만 오류가 나지 않는 것을 확인할 수 있습니다.

1.5.4. 가변 길이 인수 목록

함수를 선언할 때 전달받을 인수의 개수를 미리 정하지 않고 받는 방법도 있습니다.

PHP 5.6 부터는 매개변수 앞에 ... 을 넣으면 간편하게 설정할 수 있어요.

위의 코드를 가변 길이 인수 목록을 적용해서 함수를 수정해보았어요.

<?php
function number_sum(...$num) {
    $result = 0;
    foreach($num as $n) {
        $result += $n;
    }
    return $result;
}
echo number_sum(1, 2, 3)."<br/>";
echo number_sum(1, 2)."<br/>";
echo number_sum(1)."<br/>";

?>

실행시켜보면, 결과가 동일한 것을 확인할 수 있습니다.

 

블로그의 정보

개발하는 두부

뚜부니

활동하기