๊ด€๋ฆฌ ๋ฉ”๋‰ด

\(@^0^@)/

[JS] ์˜ต์…”๋„ ์ฒด์ด๋‹ ?. ๋ณธ๋ฌธ

TIL

[JS] ์˜ต์…”๋„ ์ฒด์ด๋‹ ?.

minjuuu 2021. 9. 2. 23:49
728x90

๐Ÿฑ‍๐Ÿ‘“ ์˜ต์…”๋„ ์ฒด์ด๋‹์„ ๋ฐฐ์šฐ๊ธฐ ์ „, ์•Œ์•„์•ผ ํ•  falsey ๊ฐ’


โœจ ์˜ต์…”๋„ ์ฒด์ด๋‹ (Optional Chaining)

ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†๋Š” ์ค‘์ฒฉ ๊ฐ์ฒด๋ฅผ ์—๋Ÿฌ ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
์˜ต์…”๋„ ์ฒด์ด๋‹์€ ์˜ต์…”๋„ ๋‚ด๋ถ€์˜ ๋‚ด๋ถ€์˜ ๋‚ด๋ถ€๋กœ ์˜ต์…”๋„์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿค” ์˜ต์…”๋„ ์ฒด์ด๋‹์„ ์“ฐ์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์˜ ์˜ˆ์‹œ๋“ค ( ์˜ต์…”๋„ ์ฒด์ด๋‹์ด ํ•„์š”ํ•œ ์ด์œ  )


1. ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๋ช… ์žˆ๋Š”๋ฐ, ๊ทธ์ค‘ ๋ช‡ ๋ช…์€ ์ด๋ฉ”์ผ ์ •๋ณด๊ฐ€ ์—†์Œ.
=> ๊ทธ๋Ÿด ๊ฒฝ์šฐ, ์ด๋ฉ”์ผ์„ ๋“ฑ๋กํ•˜์ง€ ์•Š์€ ์œ ์ €์˜ ์ด๋ฉ”์ผ ์ •๋ณด์— ์ ‘๊ทผํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ

2. JS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์š”์†Œ์— ์ ‘๊ทผํ•ด, ์š”์†Œ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค ํ•  ๋•Œ
(์˜ต์…”๋„ ์ฒด์ด๋‹์ด ๋‚˜์˜ค๊ธฐ ์ „์—๋Š” && ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ์ฝ”๋“œ๊ฐ€ ์•„์ฃผ ๊ธธ์–ด์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Œ)

let nestedProp = ((obj.first === null || obj.first === undefined) ? undefined : obj.first.second);

๐Ÿง ์˜ต์…”๋„ ์ฒด์ด๋‹์˜ ์‚ฌ์šฉ๋ฒ•
?. ์•ž์— ์žˆ๋Š” ๋Œ€์ƒ์ด (truthy)์ธ ๊ฐ’์ด๋ฉด ๋’ค ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ ,
๊ฑฐ์ง“(falsy)์ธ ๊ฐ’์ด๋ฉด ํ‰๊ฐ€๋ฅผ ๋ฉˆ์ถ”๊ณ , ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ 
undefined๋กœ ๋งŒ๋“ค์–ด ๋ฒ„๋ฆฐ๋‹ค.

 

let user = {}; // ์ด๋ฉ”์ผ ์ •๋ณด๊ฐ€ ์—†๋Š” ์‚ฌ์šฉ์ž

alert( user?.email?.address ); // undefined, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ.
// user?.email ๋กœ ์ด๋ฉ”์ผ์„ ์ฝ์œผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด user ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋”๋ผ๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ.

let user = null;

console.log( user?.email );  // undefined
console.log( user?.email.address )  // undefined

// user ๊ฐ€ null ์ด๋‚˜ undefined ๊ฐ€ ์•„๋‹ˆ๊ณ ,
// ์‹ค์ œ ๊ฐ’์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—” ๋ฐ˜๋“œ์‹œ user.email ํ”„๋กœํผํ‹ฐ๋Š” ์žˆ์–ด์•ผ ํ•จ.
// ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, user?.email.address ์˜ ๋‘ ๋ฒˆ์งธ ์  (.address) ์—ฐ์‚ฐ์ž์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ.
// dogName ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋”๋ผ๋„, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ.

const user = {
  name: 'amy',
  cat: {
    name: 'nemo'
  }
};

const dogName = adventurer.dog?.name;
console.log(dogName);
// expected output: undefined

console.log(user.someNonExistentMethod?.());
// expected output: undefined

์˜ต์…”๋„ ์ฒด์ด๋‹์€ ์•ž์— ์žˆ๋Š” ๋Œ€์ƒ์—๋งŒ ๋™์ž‘๋œ๋‹ค.


๐Ÿง ์˜ต์…”๋„ ์ฒด์ด๋‹ ์‚ฌ์šฉ์‹œ ์ฃผ์˜์ 

1.  ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์€ ๋Œ€์ƒ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.
์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ์„ ๋‹ค๋ฃจ๋Š” ์œ„์˜ ์˜ˆ์‹œ์—๋Š” ๋ฐ˜๋“œ์‹œ user๊ฐ€ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ, email์€ ํ•„์ˆ˜ ๊ฐ’์ด ์•„๋‹˜.
๊ทธ๋Ÿฌ๋ฏ€๋กœ user.email?.address ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.
์‹ค์ˆ˜๋กœ user ์— ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์ดํ›„์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ์‹ ์ค‘ํ•ด์•ผ ํ•จ!

2. ์•ž์˜ ๋ณ€์ˆ˜๋Š” ๊ผญ ์„ ์–ธ๋˜์–ด ์žˆ์–ด์•ผ ํ•จ.
๋ณ€์ˆ˜ user ๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด user?.anything ํ‰๊ฐ€ ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

// ReferenceError: user is not defined
user?.email;

์˜ต์…”๋„ ์ฒด์ด๋‹์€ ์„ ์–ธ์ด ์™„๋ฃŒ๋œ ๋ณ€์ˆ˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ๋งŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—,
user?.anything์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด let์ด๋‚˜ const๋ฅผ ์‚ฌ์šฉํ•ด์„œ user๋ฅผ ์ •์˜ํ•ด์•ผ ํ•จ.

3. ๋‹จ๋ฝ ํ‰๊ฐ€ : ์™ผ์ชฝ ํ‰๊ฐ€๋Œ€์ƒ์— ๊ฐ’์ด ์—†์œผ๋ฉด ์ฆ‰์‹œ ํ‰๊ฐ€๋ฅผ ๋ฉˆ์ถค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋น„๋กฏํ•œ ์˜ต์…”๋„ ์ฒด์ด๋‹์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋ถ€๊ฐ€ ๋™์ž‘๋“ค์€ ์˜ต์…”๋„ ์ฒด์ด๋‹์˜ ํ‰๊ฐ€๊ฐ€ ๋ฉˆ์ท„์„ ๋•Œ ๋”๋Š” ์ผ์–ด๋‚˜์ง€ ์•Š์Œ.

let user = null;
let num = 0;

user?.hi(num++); // ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Œ.

alert(num); // ๊ฒฐ๊ณผ๊ฐ’์€ 0, num์€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿง ?.( ) ์™€ ?.[ ] ์‚ฌ์šฉ๋ฒ•
์˜ต์…”๋„ ์ฒด์ด๋‹์€ ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹ˆ๋ผ, ํ•จ์ˆ˜๋‚˜ ๋Œ€๊ด„ํ˜ธ์™€ ํ•จ๊ป˜ ๋™์ž‘ํ•˜๋Š” ํŠน๋ณ„ํ•œ ๋ฌธ๋ฒ• ๊ตฌ์กฐ์ฒด์ด๋‹ค.

1. ?.( )
๋‘ ์ƒํ™ฉ ๋ชจ๋‘์—์„œ user ๊ฐ์ฒด๋Š” ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— email ํ”„๋กœํผํ‹ฐ๋Š” . ๋งŒ ์‚ฌ์šฉํ•ด์„œ ์ ‘๊ทผ ํ›„,
?.( ) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ email์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•จ.

// ํ•œ ๊ฐ์ฒด์—๋Š” ๋ฉ”์„œ๋“œ email์ด ์žˆ์ง€๋งŒ, ๋‹ค๋ฅธ ๊ฐ์ฒด์—๋Š” ์—†๋Š” ์ƒํ™ฉ
// ?.() ์„ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ

let user1 = {
  email() {
    alert("user1์˜ email");
  }
}

let user2 = {};

user1.admin?.(); // user1์˜ email
user2.admin?.();


user1 ์—๋Š” email ์ด ์ •์˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ํ˜ธ์ถœ๋œ ๋ฐ˜๋ฉด,
user2 ์—๋Š” email ์ด ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์—๋Ÿฌ ์—†์ด ๊ทธ๋ƒฅ ํ‰๊ฐ€๊ฐ€ ๋ฉˆ์ถค.


2. ?.[ ]
. ๋Œ€์‹  ๋Œ€๊ด„ํ˜ธ [ ] ์„ ์‚ฌ์šฉํ•ด ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ?.[ ] ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ?.[ ] ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๊ฐ์ฒด ์กด์žฌ ์—ฌ๋ถ€๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ์•ˆ์ „ํ•˜๊ฒŒ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Œ.

// ํ•œ ๊ฐ์ฒด์—๋Š” ๋ฉ”์„œ๋“œ email์ด ์žˆ์ง€๋งŒ, ๋‹ค๋ฅธ ๊ฐ์ฒด์—๋Š” ์—†๋Š” ์ƒํ™ฉ
// ?.[] ์„ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ

let user1 = {
  email: "google.com"
};

let user2 = null; // user2๋Š” ๊ถŒํ•œ์ด ์—†๋Š” ์‚ฌ์šฉ์ž๋ผ๊ณ  ๊ฐ€์ •.

let key = "email";

alert( user1?.[key] ); // email
alert( user2?.[key] ); // undefined

alert( user1?.[key]?.something?.not?.existing); // undefined

 

3. ?. ์€ delete์™€ ์กฐํ•ฉํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

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

 

4. ?. ์€ ์ฝ๊ธฐ๋‚˜ ์‚ญ์ œ๋Š” ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์“ฐ๊ธฐ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ. ( ?. ์€ ํ• ๋‹น ์—ฐ์‚ฐ์ž ์™ผ์ชฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ )

// user๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ user.email ๊ฐ’์„ ์“ฐ๋ ค๊ณ  ์‹œ๋„ ํ•  ๊ฒฝ์šฐ

user?.email = "google.com"; // SyntaxError: Invalid left-hand side in assignment
// ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” undefined = "google.com"์ด ๋˜๊ธฐ ๋•Œ๋ฌธ.

โšก ์š”์•ฝ

์˜ต์…”๋„ ์ฒด์ด๋‹ ๋ฌธ๋ฒ• ?. ์€ ์„ธ ๊ฐ€์ง€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. obj?.prop – obj๊ฐ€ ์กด์žฌํ•˜๋ฉด obj.prop์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•จ
  2. obj?.[prop] – obj๊ฐ€ ์กด์žฌํ•˜๋ฉด obj[prop]์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•จ
  3. obj?.method() – obj๊ฐ€ ์กด์žฌํ•˜๋ฉด obj.method()๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•จ

?. ์™ผ์ชฝ ํ‰๊ฐ€ ๋Œ€์ƒ์ด null์ด๋‚˜ undefined์ธ์ง€ ํ™•์ธํ•˜๊ณ  null์ด๋‚˜ undefined๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ํ‰๊ฐ€๋ฅผ ๊ณ„์† ์ง„ํ–‰
?.๋ฅผ ๊ณ„์† ์—ฐ๊ฒฐํ•ด์„œ ์ฒด์ธ์„ ๋งŒ๋“ค๋ฉด ์ค‘์ฒฉ ํ”„๋กœํผํ‹ฐ๋“ค์— ์•ˆ์ „ํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ.
?.์˜ ์™ผ์ชฝ ํ‰๊ฐ€๋Œ€์ƒ์ด ์—†์–ด๋„ ๊ดœ์ฐฎ์€ ๊ฒฝ์šฐ์—๋งŒ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.
๊ผญ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฐ’์ธ๋ฐ ์—†๋Š” ๊ฒฝ์šฐ์— ?.์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—๋Ÿฌ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ฃผ์˜!


โ€ป ์ฐธ๊ณ  : ZeroCho Tv - ES2021 ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ•์ขŒ

โ€ป ์ฐธ๊ณ  : https://ko.javascript.info/optional-chaining

โ€ป ์—ฐ์‚ฐ ํ€ด์ฆˆ ์ฐธ๊ณ  : https://velog.io/@yejinh/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-null-%EB%B3%91%ED%95%A9-%EC%97%B0%EC%82%B0%EC%9E%90%EC%99%80-%EC%98%B5%EC%85%94%EB%84%90-%EC%B2%B4%EC%9D%B4%EB%8B%9D

โ€ป falsey ๊ฐ’ MDN : https://developer.mozilla.org/ko/docs/Glossary/Falsy

โ€ป ์˜ต์…”๋„ ์ฒด์ด๋‹ MDN : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Optional_chaining

 

728x90