기본 콘텐츠로 건너뛰기

Void 다시 돌아보기.

  옛날 코드에서는 void라는 키워드를 자주 보았을 것이고, 리턴 타입을 정의해야하는 언어를 사용하는 개발자라면, 수도 없이 보았을 만한 키워드이다.

 하지만, 자바스크립트 기준으로 생각을 해보자.



void function test() {
console.log('called test')
}

test()


 위와 같은 코드르 보자, 자바스크립트를 배우지 않았지만, c라이크 언어를 배운 사람이라면, 아 test함수에는 반환값이 없구나 하고, 넘어갈 코드이다. 하지만....

 Uncaught ReferenceError: test is not defined

 저 코드에는 test자체가 존재 하지 않는다. 옛날의 자바스크립트에서는 undefined가 읽기 전용 이 아니라, 쓰기가 가능한 변수였다. 그래서 undefined를 재정의 할 수 있었기에,


undefined = void 0;



function foo(undefined) {
var a;
console.log(a === undefined)
}

foo()

 위 처럼 void가 평가가 항상 undefined인 것을 고려하여, 위와 같이 undefined를 안전하게 관리하거나, 함수의 가장 마지막 인자를 항상 undefined로 이름으로 정의하여, undefined를 안전하게 관리 하였다.


 이젠, undefined를 재정의 할 수 없으니, 절~~대 사용하면 안되는 방식이다.

 그렇다면, 이제 void 키워드는 더 이상 쓰지 않을만한 내용일까?

https://sejiwork.blogspot.com/2021/10/javascript-pseudo-protocol.html

 a 태그 사용 시 click 이벤트만 사용 할 때에 사용 할 수 있긴 하지만.... 이걸 써야 할 까? 이 생각은 머리에서 떠나지 않는다. button태그가 있는데 굳이?

 우리는 자바스크립트 사용자라면, function 보다는 arrow function이 짧기 때문에, this키워드를 사용 하지 않는 경우 arrow function을 더 선호할 것이다.

 하지만, arrow function의 경우 암묵적 리턴을 허용한다.


const macroConsole = {
log: (msg) => setTimeout( console.log( msg ) )
}

macroConsole.log('123')

위의 경우는 그냥 예시 일 뿐이다. console.log를 위 처럼 만들면, 첫 인자만 가능하기 때문에, arguments를 허용하는 function을 사용 하는 것이 맞을 것이다.

 여기서 눈여겨 볼 것은, 리턴값이다.


macroConsole.log('123')

 결국 macroConsole.log의 리턴값은 setTimeout의 리턴 값을 갖는다. 하지만 그것이 의미가 있는가? console.log의 리턴값으로 맞추어주는 게 더 맞지 않을까? 라는 내용이다.


const macroConsole = {
log: (msg) => setTimeout( console.log( msg ) ),
logVoid: (msg) => void setTimeout( console.log( msg ) )
}
const logRes = macroConsole.log('123')
console.log('logRes', logRes) // logRes 1
const logVoidRes = macroConsole.logVoid('123')
console.log('logVoidRes', logVoidRes) // logVoidRes undefined

 사실 뭐 암묵적 리턴이 안되게 expression이 아니라 statment로 작성 하는 것도 방법이긴 하다.


 void 필요한가....? 아직도 deprecated가 안된 것이 애매하긴 하다.


댓글