Frontend๐ŸŽจ/JavaScript๐Ÿ’›, TypeScript๐Ÿ’™

[JavaScript, TypeScript] ์˜ต์…”๋„ ์ฒด์ด๋‹(Optional Chaining)์ด๋ž€?

JanuDev 2024. 12. 10. 22:49

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋‘˜ ๋‹ค ์‚ฌ์šฉ๋˜๋Š” ์˜ต์…”๋„ ์ฒด์ด๋‹...

๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ์—„์ฒญ ๋งŽ์ด ์“ฐ๊ฒŒ ๋˜์„œ ์•Œ๊ธฐ ์‹ซ์–ด๋„ ์•Œ ์ˆ˜๋ฐ–์— ์—†๋Š” ์ง€๊ฒฝ์— ์ด๋ฅด๋ €๋‹ค...

 

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

๋งŒ์•ฝ ๊ฐ’์ด ์—†์œผ๋ฉด(= null ํ˜น์€ undefined๋ผ๋ฉด) ๊ทธ๋ƒฅ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ผ๋Š” ์•ˆ์ „์žฅ์น˜์ด๋‹ค. 

Exception์ด๋‚˜ ์—๋Ÿฌ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋„๋ก ๋„์™€ ์˜ค๋ฅ˜ ์—†์ด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์†์„ฑ์— ์ ‘๊ทผํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ํŠนํžˆ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด์˜ ์†์„ฑ์— ์ ‘๊ทผํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ธ๋‹ค.

๊ฐ€์žฅ ํฐ ์ด์ ์€ (1) ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ž„ (2) ๋ถˆํ•„์š”ํ•œ ์กฐ๊ฑด๋ฌธ์„ ์ค„์ž„ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

 

์ฐธ๊ณ ๋กœ ํ•„์ž๋Š” ์ธํ…”๋ฆฌ์ œ์ด์—์„œ ๋นจ๊ฐ„์ค„ ์ƒ๊ฒจ์„œ ํ•„์š”์—†์–ด๋„ ๊ทธ๋ƒฅ ์“ด๋‹ค(์ •์ƒ์ ์œผ๋กœ ์ž˜ ์ž‘๋™๋˜๋Š”๋ฐ ์™œ ๋นจ๊ฐ„์ค„์ด ๋‚˜๋Š”์ง„ ๋‚˜๋„ ๋ชจ๋ฅด๊ฒ ์Œ¯\_(ใƒ„)_/¯)

 

์˜ˆ์‹œ

๋‚˜๋ฃจํ† ์ฟค์€ ์˜ํ˜ผ์˜ ์นœ๊ตฌ ์‚ฌ์Šค์ผ€์˜ ์ง‘ ์ฃผ์†Œ๋ฅผ ์ฐพ์•„๊ฐ€๊ณ  ์‹ถ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์Šค์ผ€๊ฐ€ ์ฃผ์†Œ๋ฅผ ์•Œ๋ ค์ฃผ์ง€ ์•Š์œผ๋ฉด ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€๊ณ ์ž ํ•œ๋‹ค.

์‚ฌ์Šค์ผ€๊ฐ€ ์ฃผ์†Œ๋ฅผ ์•Œ๋ ค์ฃผ์ง€ ์•Š์€ ๊ฒƒ = null ํ˜น์€ undefined ์ƒํƒœ, ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ = undefined๋กœ ์ถœ๋ ฅํ•˜๋Š” ์ƒํƒœ.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ์—ฐ์Šตํ•ด๋ณด์ž!

const friend = {
  name : "Sasuke",
  address : {
    	village : "leaf"
        country : "fire"
    },
};

์‚ฌ์Šค์ผ€๊ฐ€ ์‚ฌ๋Š” ๋งˆ์„์„ ์ฝ˜์†”๋กœ ์ฐ์–ด๋ณด์ž.

console.log("Sasuke's village : ", friend.address.village); 
// ์‚ฌ์Šค์ผ€๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง‘์„ ์•Œ๋ ค์คฌ๋‹ค๋ฉด leaf๊ฐ€, ์•ˆ์•Œ๋ ค์คฌ์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค.

const village = friend.address?friend.address.village:undefined;
console.log(village); // 'leaf' ํ˜น์€ 'undefined' ์ถœ๋ ฅ
// ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ์ž์ฒด์ ์œผ๋กœ ์กฐ๊ฑด๋ฌธ์„ ๊ฑธ์–ด undefined๊ฐ€ ์ถœ๋ ฅ๋˜๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

๋ณ€๋•์ด ์‹ฌํ•œ ์‚ฌ์Šค์ผ€๊ฐ€ ์ฃผ์†Œ๋ฅผ ๋‚˜๋ฃจํ† ์ฟค์—๊ฒŒ ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‚˜๋ฃจํ† ์ฟค์€ ์นœ๊ตฌ์˜ ์ง‘์„ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์—†๋‹ค. ๊ฒฐ๊ตญ ์ฝ˜์†”์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๊ณ , ์ด๋ฅผ ๋ง‰์„๋ ค๋ฉด ๊ท€์ฐฎ์€ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ ‡์ง€๋งŒ ์˜ต์…”๋„ ์ฒด์ด๋‹์„ ํ†ตํ•ด ์ € ๊ท€์ฐจ๋‹ˆ์ฆ˜์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

const village = friend.address?.city; // Optional chaining ์ด์šฉ
console.log("์‚ฌ์Šค์ผ€์˜ ์ง‘ : ", village); // leaf, ํ˜น์€ undefined ์ž๋™ ์ถœ๋ ฅ

 

์˜ต์…”๋„ ์ฒด์ด๋‹์€ null์ด๋‚˜ undefined๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฐ์ฒด ์†์„ฑ์— ?. ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ์†์„ฑ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค. address์™€ ๊ฐ™์ด ํŠนํžˆ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด์—์„œ ์‚ฌ์šฉ์ด ์šฉ์ดํ•˜๋ฉฐ, null ํ˜น์€ undefined๋กœ ์ธํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค. 

 

์‚ฌ์šฉํ•˜๋Š” ์ƒํ™ฉ

ํ•„์ž์˜ ๊ฒฝ์šฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋Œ€๋ถ€๋ถ„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ๋„ ๋ณธ์ธ์˜ ์ž…๋ง›์— ๋งž๊ฒŒ ๋‹ค์–‘ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1. ๊ฐ์ฒด์˜ ์†์„ฑ์ด ์—†๋Š” ๊ฒฝ์šฐ

const friend = {
  name : "Sakura",
  profile : {
    age: 15,
    hair : pink
   },
 };
 
 console.log("Sakura's hobby : ", friend.profile?.hobby); // hobby๋Š” ์—†์œผ๋ฏ€๋กœ undefined ์ถœ๋ ฅ

์œ„ ์‚ฌ์ฟ ๋ผ์งฑ์˜ ์ทจ๋ฏธ๋Š” profile์— ์—†๋Š” ์†์„ฑ์ด๋ฏ€๋กœ hobby๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์–ด๋„ undefined๊ฐ€ ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.

 

2. ๋ฐฐ์—ด์˜ ์š”์†Œ์— ์ ‘๊ทผํ•  ๋•Œ

const friends = [
  {name : "Sasuke", hair: "black"},
  {name : "Sakura", hair: "pink"},
  {name : "Sikamaru", hair: "black"},
  {name : "Chouji", hair: "brown"},
];

const friendName = friends[4]?.name; // undefined

์œ„ ์˜ˆ์‹œ์—์„œ 4๋ฒˆ์งธ ์ธ๋ฑ์Šค์˜ ์นœ๊ตฌ๋Š” ์—†์œผ๋ฏ€๋กœ(=null) undefined๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค

ํ˜น์€ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ํ™•์ธํ•  ๋•Œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ,

const friend = [];

const firstFriend = friend[0]?.length; // undefined

๋กœ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

3. ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ

๊ฐ์ฒด๊ฐ€ ํ•จ์ˆ˜์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜์„ ๋–„ ์•ˆ์ „ํ•˜๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜  ์žˆ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

// ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋˜์—ˆ์œผ๋ฉด ํ˜ธ์ถœ
const hello = {
  greet : () => "Hello!",
};
console.log(hello.greet?.()); // "Hello!" ์ถœ๋ ฅ

// ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ undefined
const notHello = {};
console.log(notHello.greet?.()) // undefined ์ถœ๋ ฅ

์˜ต์…”๋„ ์ฒด์ด๋‹์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด?

์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋Œ€์ฒดํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋งŽ์ง€๋งŒ, ์ œ์ผ ์ค‘์š”ํ•œ๊ฑด ๊ท€์ฐฎ๋‹ค.

๋ณดํ†ต ์กฐ๊ฑด๋ฌธ์ด๋‚˜ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ,

if (friend && friend.profile && friend.profile.hair) {
  console.log(friend.profile.hair);
  }else{
  console.log("undefined");
  };

์ด๋Ÿฐ์‹์œผ๋กœ ์กฐ๊ฑด๋ฌธ์„ ๋Š˜์–ด์ง€๊ฒŒ ์จ์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Ÿฌ๋ฉด ๋„ˆ๋ฌด ๊ธธ์–ด์ง„๋‹ค!

 

๋”ฐ๋ผ์„œ ์˜ต์…”๋„ ์ฒด์ด๋‹์€ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ค„์ด๋Š”๋ฐ๋„ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฒฐ๋ก 

๊ทธ๋ฐ–์—๋„ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง, ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ์˜ต์…˜ ๊ฐ์ฒด ์ฒ˜๋ฆฌ ๋“ฑ๋“ฑ์—์„œ ์‚ฌ์šฉ๋˜์ง€๋งŒ ๋„ˆ๋ฌด ๋‚จ๋ฐœํ•ด์„œ๋„ ์•ˆ๋œ๋‹ค. ๋‚˜์ค‘์— ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ... 

๋ชจ๋‘๋“ค ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•˜๊ณ  ํ–‰๋ณต์ฝ”๋”ฉํ•˜์ž!