본문 바로가기
서버/라라벨

PHP - closure(클로저)

by 나이아카 2022. 10. 14.

 회사에서 서버 프레임워크로 라라벨을 이용하고 있습니다... 덕분에 서버 개발자로서의 첫 발을 라라벨로 내딛게 되었는데요. 문제는 제가 PHP 지식이 하나도 없다는 점입니다. 그래서 이제부터 PHP를 공부해보려고 합니다.(뭐든 알아두면 좋지 않을까 하는 호기심 가득한 개발자라 다행인 것 같습니다.)


 PHP에서 Closure는 5.3 버전에서 처음 등장했습니다. 더욱이 5.4 버전부터 추가적인 메소드들이 제공되어 조금 더 클로저를 사용하기 편리해졌습니다. 뭐, 이미 PHP가 8버전까지 나왔으니 왠만한 PHP 코드들은 다 Closure를 사용할 수 있다고 볼 수 있겠습니다.(보편적으로 7.x 버전을 사용한다고 하더라도)

 PHP 공식문서에서는 아래와 같이

Class used to represent anonymous functions.

 익명함수를 나타내기 위해 사용하는 클래스라고 소개하고 있습니다.

 그렇다면 익명함수가 무엇인지 먼저 보고 가야 클로저에 대한 이해가 더 높아질 것 같다는 생각이 듭니다. 익명함수는 자바를 공부할 때도, JavaScript에서도 사용되는 개념입니다. 익명 함수는 익명이라는 의미처럼 함수에게 이름이 할당되지 않는 것을 의미하는데요. PHP에서는 function {name} (parameter) { code block } 형태로 함수가 구현되는데, 익명함수는 여기서 name이 빠지는 것을 의미합니다. 그러나 보통 우리는 함수를 name() 형태로 사용하는데 name이 없는 경우 일반적인 함수 호출식으로는 호출할 수 없습니다.

 

$testVariable = function ($a, $b){
    return $a + $b;
};

//테스트
//값은 true
$this -> assertEquals(3, $testVariable(1, 2));

 그래서 위와 같이 익명함수는 변수에 대입해서 할당한 후, 그 변수를 이용해 호출해야 합니다. 이러한 익명함수는 1회용 함수로서 그 역할을 다 합니다. 기존의 함수의 경우 계속해서 호출될 것이라 예상되기 때문에 메모리 상에 계속해서 존재하고 있지만, 익명함수의 경우에는 한 번 실행되고 난 후에는 사라지게 됩니다. 그래서 익명함수의 경우 함수처럼 기능을 블럭 단위로 사용해야 하나, 그 함수의 재사용성이 매우 적고 좁은 범위에서 이용하는 경우 효율적으로 사용할 수 있습니다.

 그렇다면 클로저는 여기서 무엇을 의미하는 것일까요? 사실 저기서 function으로 만들어낸 변수 자체를 클로저라고 부를 수 있습니다.

 

$this->assertEquals($testVariable(1,2), $this->closureTest($testVariable, 1, 2));

public function closureTest(\Closure $test, int $a, int $b): int {
    return $test($a, $b);
}

 위와 같은 코드처럼 Closure Class로 익명함수를 대입한 변수를 받아 값을 리턴해주는 코드도 작성할 수 있습니다. Closure Class를 이용하면 람다 함수를 호출하는 것 처럼 사용할 수 있게 됩니다.  또한 use 키워드를 사용하면 파라미터로 받는 값 외에도 익명함수가 선언되어 있는 바로 밖의 변수들을 참조할 수 있습니다.

 

public function test() {
    $x = 3;
    $testVariable = function ($a, $b) use($x) {
        $x++;
        return $a + $b + $x;
    };

    $this->assertEquals(7, $this->closureTest($testVariable, 1, 2));
}

 

 위와 같이 익명함수 testVariable 밖에 선언된 x를 use 키워드를 이용해서 불러와서 내부에서 사용할 수 있습니다. 라라벨에서 이러한 Closure를 라우터에서 간단한 처리를 위해 아래처럼 이용하는 코드에서 처음 볼 수 있습니다!

Route::get("get-test", function (){
 return "get-test"
});

 여러 언어를 거치다보면 익숙한 듯 어색한 단어와 개념들이 머릿속을 다녀가곤 합니다. 익숙한 익명함수의 개념이지만, 확인하기 어려운 내부 동작 방식은 뭔가 생각대로 잘 굴러가지 않는 등, 새로운 언어를 배울 때 새로운 언어의 특성을 완벽하게 숙지하지 못한 채 코딩을 진행하니 확실히 부족한 실력이 더더욱 부각되네요.

처음으로 하는 PHP 공부지만, 좀 더 발전해서 프론트와 라라벨을 동시에 석권할 수 있는 그런 개발자가 되어보겠습니다! 

댓글