72호. void 리턴 타입의 가치 free

2019-10-15

void 리턴 타입 힌트는 PHP 7.1에서 추가되었습니다. 프릭은 원래 void 리턴 타입에 대해 회의적이었는데, 최근에 생각이 바뀌었다고 하네요. 프릭이 생각하는 void 리턴 타입의 가치는 다음의 두 가지를 알려주는 것이라고 합니다.



  • 아무것도 반환하지 않는 기능임을 알려줌.

  • 주어진 파라미터가 변할 수 있음(Mutable)을 알려줌.


아무것도 반환하지 않는 기능임을 알려줌


void 리턴 타입은 함수가 무언가를 수행하기만 하는지, 결과를 만들어 반환하는지 명확하게 구분하려는 목적으로 도입되었습니다.


function should_return_nothing(): void {
    return 1; // Fatal error: A void function must not return a value
}

위와 같이 void 리턴 타입이 정의된 함수에서 값을 반환하려고 하면 에러가 발생합니다. 따라서 리턴 값이 없다는 것을 확신할 수 있습니다.


주어진 파라미터가 변할 수 있음(Mutable)을 알려줌


프릭은 PHP에서는 객체가 레퍼런스로 전달된다고 이야기하고(하지만 이는 흔한 오해이며, 레퍼런스가 전달되는 건 아니고 포인터가 복사되어 전달된다고 합니다.) 엘로퀀트의 로컬 스코프를 예로 들어 설명했습니다.


라라벨 메뉴얼의 로컬 스코프 예제는 다음과 같이 값을 반환합니다.


public function scopePopular($query)
{
    return $query->where('votes', '>', 100);
}

하지만 실제로 값을 반환받아서 사용하는게 아니고, 파라미터로 넘겨받은 $query가 바로 변경되므로 다음과 같이 코드를 작성한다고 합니다.


public function scopePopular($query): void
{
    $query->where('votes', '>', 100);
}

저도 프릭이 제안한대로 스코프 매서드를 void로 바꿔봤는데 정말로 같은 결과가 나오더군요.


마치며


오늘은 프릭 반 더 하르텐의 The value of the void typehint in PHP의 내용을 소개해드렸습니다. 프릭이 말하는 첫번째 가치는 어찌보면 너무 당연한 것인데, 두 번째 가치는 생각하지 못했던 것이었습니다. 

객체가 포인터로 넘어가기 때문에 매서드 안에서 변경이 일어나도 매서드를 호출한 외부에서도 변경된 값이 유지되는 것은 처음 알았네요. &를 붙여서 레퍼런스를 넘겨야만 매서드 내부에서의 변화가 반영된다고 알고 있었거든요. ㅠ 갑자기 비전공자 특유의 기본기 부족하다는 자격지심이 마구 올라오네요.


내일도 더 열심히!

1일 1식 라라벨 72호2019년 10월 15일


이현석

메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.