๐ŸŽจFrontEnd/Javascript

์˜ต์…”๋„ ์ฒด์ด๋‹์ด๋ž€?. javascript optional chaining ?.

IOTrue 2023. 1. 4. 14:36

๐Ÿ˜Ž ์˜ต์…”๋„ ์ฒด์ด๋‹์ด๋ž€?

โœ… ์˜ต์…”๋„ ์ฒด์ด๋‹?.

์˜ต์…”๋„ ์ฒด์ด๋‹(optional chaining) ?. ์„ ์‚ฌ์šฉํ•˜๋ฉด
ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†๋Š” ์ค‘์ฒฉ ๊ฐ์ฒด๋ฅผ ์—๋Ÿฌ ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ex) user.getAddress?.()

 

 

โœ… ์˜ต์…”๋„ ์ฒด์ด๋‹์ด ํ•„์š”ํ•œ ์ด์œ 

์—†๋Š” ์ •๋ณด

์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๋ช… ์žˆ๊ณ , ๊ทธ์ค‘ ๋ช‡ ๋ช…์€ ์ฃผ์†Œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

์ด๋Ÿด ๋•Œ user.address.street๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ์†Œ ์ •๋ณด์— ์ ‘๊ทผํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

let user = {} //์ฃผ์†Œ ์ •๋ณด๊ฐ€ ์—†๋Š” ์‚ฌ์šฉ์ž
console.log(user.address.street) //TypeError: Cannot read property 'street' of undefined

 

์•„์ง ๊ทธ๋ ค์ง€์ง€ ์•Š์€ DOM

๋˜ ๋‹ค๋ฅธ ์ƒํ™ฉ์œผ๋กœ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ

ํŽ˜์ด์ง€์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์š”์†Œ์— ์ ‘๊ทผํ•ด ์š”์†Œ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

//querySelector(...) ํ˜ธ์ถœ ๊ฒฐ๊ณผ๊ฐ€ null์ธ ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฐœ์ƒ
let html = document.querySelector('.element').innerHTML;

 

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด && ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์™”๋‹ค.

let user = {} //์ฃผ์†Œ ์ •๋ณด๊ฐ€ ์—†๋Š” ์‚ฌ์šฉ์ž
console.log( user && user.address && user.address.street )
//undefined, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค

์ด๋ ‡๊ฒŒ AND๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์•„์ฃผ ๊ธธ์–ด์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

 

 

โœ… ์˜ต์…”๋„ ์ฒด์ด๋‹์˜ ๋“ฑ์žฅ ' ?. '

?.์€ ?.'์•ž’์˜ ํ‰๊ฐ€ ๋Œ€์ƒ์ด undefined๋‚˜ null์ด๋ฉด ํ‰๊ฐ€๋ฅผ ๋ฉˆ์ถ”๊ณ  undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋งจ ์ฒ˜์Œ ์˜ˆ์‹œ ์ฝ”๋“œ์™€ ๋น„๊ตํ•ด๋ณด์ž.

// ?. ๋ฏธ์‚ฌ์šฉ
let user = {} //์ฃผ์†Œ ์ •๋ณด๊ฐ€ ์—†๋Š” ์‚ฌ์šฉ์ž
console.log(user.address.street) //TypeError: Cannot read property 'street' of undefined

// ?.์‚ฌ์šฉ
let user = {} //์ฃผ์†Œ ์ •๋ณด๊ฐ€ ์—†๋Š” ์‚ฌ์šฉ์ž
console.log( user?.address?.street ); //undefined, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค

 

์˜ต์…”๋„ ์ฒด์ด๋‹ ํ•ต์‹ฌ

  • ?.์€ ?. ‘์•ž’ ํ‰๊ฐ€ ๋Œ€์ƒ์—๋งŒ ๋™์ž‘๋˜๊ณ , ํ™•์žฅ ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค
  • ?.์•ž์˜ ๋ณ€์ˆ˜๋Š” ๊ผญ ์„ ์–ธ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    ๋ณ€์ˆ˜ user๊ฐ€ ์„ ์–ธ๋˜์–ด์žˆ์ง€ ์•Š์œผ๋ฉด user?.anything ํ‰๊ฐ€์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ๋ฌธ๋ฒ• : obj?.prop     
              obj?.[expr]
              obj?.()
              arr?.[index]
              func?.(args)
user?.address //ReferenceError: user is not defined

 

์˜ต์…”๋„ ์ฒด์ด๋‹ ์ฃผ์˜์ 

  • ์˜ต์…”๋„ ์ฒด์ด๋‹์„ ๋‚จ์šฉํ•˜์ง€ ๋ง์ž.
  • ?.๋Š” ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์€ ๋Œ€์ƒ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.โญ

์‚ฌ์šฉ์ž ์ฃผ์†Œ๋ฅผ ๋‹ค๋ฃจ๋Š” ์œ„์˜ ์˜ˆ์‹œ์—์„œ

๋…ผ๋ฆฌ์ƒ user๋Š” ๋ฐ˜๋“œ์‹œ ์žˆ์–ด์•ผ ํ•˜๊ณ , address๋Š” ํ•„์ˆ˜๊ฐ’์ด ์•„๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ user.address?.street๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•œ ์‚ฌ์šฉ๋ฒ•์ด๋‹ค.
์™œ๋ƒ๋ฉด ์–ด๋– ํ•œ ์‹ค์ˆ˜๋กœ ์ธํ•ด ๊ผญ ํ•„์š”ํ•œ ์ •๋ณด์ธ user์— ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด

์ด ์‚ฌ์‹ค์„ ๋ฐ”๋กœ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ์—๋Ÿฌ๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด ๋ฌธ์ œ ํŒŒ์•…๊ณผ ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ์ง„๋‹ค.

 

๋‹จ๋ฝ ํ‰๊ฐ€

๋…ผ๋ฆฌ ์—ฐ์‚ฐ ์‹œ ์ฒซ ๋ฒˆ์งธ ๊ฐ’๋งŒ์œผ๋กœ ๊ฒฐ๊ณผ๊ฐ€ ํ™•์‹คํ•  ๋•Œ ๋‘ ๋ฒˆ์งธ ๊ฐ’์€ ํ‰๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•

?.๋Š” ์™ผ์ชฝ ํ‰๊ฐ€ ๋Œ€์ƒ์— ๊ฐ’์ด ์—†์œผ๋ฉด ์ฆ‰์‹œ ํ‰๊ฐ€๋ฅผ ์ค‘๋‹จํ•œ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ?. ์˜ค๋ฅธ์ชฝ ๋ถ€๊ฐ€ ๋™์ž‘์€ ?.์˜ ํ‰๊ฐ€๊ฐ€ ๋ฉˆ์ท„์„ ๋•Œ ์ค‘๋‹จ๋œ๋‹ค.

let user = null;
let x = 0;
user?.hello(x++); // hello()๋Š” ์ค‘๋‹จ๋œ๋‹ค
console.log(x); // 0, x๋Š” ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค

 

?.์˜ ์‚ฌ์šฉ ๊ธฐ๋Šฅ

์‚ฌ์šฉ ๊ฐ€๋Šฅ : ์ฝ๊ธฐ, ์‚ญ์ œ

์‚ฌ์šฉ ๋ถˆ๊ฐ€ : ์“ฐ๊ธฐ

// ์‚ญ์ œ
delete user?.name //user๊ฐ€ ์กด์žฌํ•˜๋ฉด user.name์„ ์‚ญ์ œ

// ์“ฐ๊ธฐ
user?.name = "opntional" //SyntaxError: Invalid left-hand side in assignment
//undefined = "opntional" ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ ๋ฐœ์ƒ

 

 

๐Ÿ’ก ์˜ต์…”๋„ ์ฒด์ด๋‹ ์ •๋ฆฌ

  • ?.์€ ?.์™ผ์ชฝ ํ‰๊ฐ€๋Œ€์ƒ์ด ์—†์–ด๋„ ๊ดœ์ฐฎ์€ ๊ฒฝ์šฐ์—๋งŒ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ?.(optional chaining)์•ž์— ์˜ค๋Š” ๋ณ€์ˆ˜๋Š” ์„ ์–ธ์ด ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ๊ผญ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฐ’์ธ๋ฐ ์—†๋Š” ๊ฒฝ์šฐ์— ?.์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—๋Ÿฌ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ 
    ์ด๋Ÿฐ ์ƒํ™ฉ์„ ๋งŒ๋“ค์ง€ ์•Š๋„๋ก ํ•˜์ž!
console.log(user?.address?.street) // user ๊ฐ์ฒด๊ฐ€ ๊ผญ ์žˆ์–ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๋œป
console.log(user.address?.street); // user ๊ฐ์ฒด๊ฐ€ ์—†๋‹ค๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ตœ๊ณ !

 

 

 

 

์ฐธ๊ณ 

https://ko.javascript.info/optional-chaining

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Optional_chaining