์๋ฐ์คํฌ๋ฆฝํธ ๋ฌผ์ํ(?) ๋ฌธ๋ฒ ์ด์ ๋ฆฌ: 3๊ฐ์ง ์ฌ์ฉ๋ฒ ์์ ์ ๋ณต
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฌผ์ํ(?) ์ฌ์ฉ๋ฒ์ ์ด์ ๋ฆฌํฉ๋๋ค. ์ผํญ ์ฐ์ฐ์, ์ต์ ๋ ์ฒด์ด๋, ๋๋ฆฌ์ฌ ์ฝ๋ ์ฑ์ ๊ฐ๋ ๊ณผ ์ค๋ฌด ์์ ๋ฅผ ํตํด ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ณ ์์ ํ๊ฒ ๋ง๋์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฝ๋๋ฅผ ์ง๋ค ๋ณด๋ฉด ์ฌ๊ธฐ์ ๊ธฐ์ ๋ฑ์ฅํ๋ ๋ฌผ์ํ(?) ๋๋ฌธ์ ๊ณ ๊ฐ๋ฅผ ๊ฐธ์ํ ๊ฒฝํ, ๋ค๋ค ํ ๋ฒ์ฏค ์์ผ์ค ๊ฑฐ์์. if๋ฌธ๊ณผ ๋น์ทํด ๋ณด์ด๊ธฐ๋ ํ๊ณ , ๊ฐ์ฒด ์์ฑ์ ๋ถ์ด ์๊ธฐ๋ ํ๊ณ , ์ฐ์ฐ์ ์ฌ์ด์ ๋ฌ๊ธ์์ด ๋ํ๋๊ธฐ๋ ํ์ฃ .
์ด ๋ฌผ์ํ๋ค์ ์ฌ์ค ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํจ์ฌ ๋ ๊ฐ๊ฒฐํ๊ณ ์ฐ์ํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ์์ฃผ ์ ์ฉํ ๋ฌธ๋ฒ์ ์ฅ์น์ ๋๋ค. ํนํ ์ค๋ฌด์์๋ ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฅผ ์ค์ฌ์ฃผ๊ณ ์์ธ ์ํฉ์ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ ๋ง ๋ง์ด ์ฌ์ฉ๋ผ์.
์ด๋ฒ ํฌ์คํธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์๋ผ๋ฉด ๋ฐ๋์ ์์์ผ ํ ๋ฌผ์ํ(?)์ ์ธ ๊ฐ์ง ์ฉ๋ฒ์ธ ์ผํญ ์ฐ์ฐ์, ์ต์
๋ ์ฒด์ด๋, ๊ทธ๋ฆฌ๊ณ ๋๋ฆฌ์ฌ ์ฝ๋ ์ฑ์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค. ๊ฐ ๋ฌธ๋ฒ์ด ์ ํ์ํ์ง, ๊ทธ๋ฆฌ๊ณ ์ค์ ์ฝ๋์์ ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง ๋ช
ํํ ์์์ ํจ๊ป ์ค๋ช
ํด ๋๋ฆด๊ฒ์. ์ด ๊ธ์ ๋๊น์ง ์ฝ์ผ์๋ฉด ๋ ์ด์ ๋ฌผ์ํ๋ฅผ ๋๋ ค์ํ์ง ์๊ณ ์์ ์์ฌ๋ก ํ์ฉํ๋ ์์ ์ ๋ฐ๊ฒฌํ๊ฒ ๋ ๊ฒ๋๋ค!
1. ์ผํญ ์ฐ์ฐ์ (Ternary Operator): ์กฐ๊ฑด ? ๊ฐ1 : ๊ฐ2
์ผํญ ์ฐ์ฐ์๋ if...else ๋ฌธ์ ํ ์ค๋ก ์ถ์ฝํด์ฃผ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฌผ์ํ ๋ฌธ๋ฒ์
๋๋ค. ์ด๋ฆ์ฒ๋ผ ์ธ ๊ฐ์ ํผ์ฐ์ฐ์(์กฐ๊ฑด, ์ฐธ์ผ ๋ ๊ฐ, ๊ฑฐ์ง์ผ ๋ ๊ฐ)๋ฅผ ํ์๋ก ํ์ฃ .
- ๋ฌธ๋ฒ:
์กฐ๊ฑด ? ์ฐธ์ผ_๋_ํํ์ : ๊ฑฐ์ง์ผ_๋_ํํ์
if...else ๋ฌธ๊ณผ ๋น๊ตํด ๋ณด๋ฉด ๊ทธ ์ญํ ์ด ๋ช
ํํ๊ฒ ๋ณด์
๋๋ค.
// if...else ๋ฌธ ์ฌ์ฉ
let isAdult;
const age = 20;
if (age > 18) {
isAdult = true;
} else {
isAdult = false;
}
console.log(isAdult); // true
// ์ผํญ ์ฐ์ฐ์ ์ฌ์ฉ
const isAdultTernary = age > 18 ? true : false;
console.log(isAdultTernary); // true
์ฝ๋๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํด์ก์ฃ ? ์ผํญ ์ฐ์ฐ์๋ ์ด๋ ๊ฒ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฐ์ ๋ณ์์ ํ ๋นํ ๋ ์์ฃผ ์ ์ฉํฉ๋๋ค.
์ผํญ ์ฐ์ฐ์์ ์ฅ์
- ๊ฐ๊ฒฐํจ:
if...else๋ธ๋ก์ ์ฌ๋ฌ ์ค ์์ฑํ ํ์ ์์ด ํ ์ค๋ก ํํํ ์ ์์ด ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์์ต๋๋ค. - ํํ์: ์ผํญ ์ฐ์ฐ์๋ ๊ฐ์ ๋ฐํํ๋ 'ํํ์โ์ด๊ธฐ ๋๋ฌธ์, ๋ณ์ ํ ๋น ์ธ์๋ ํจ์์ ์ธ์๋ ๋ค๋ฅธ ํํ์ ๋ด๋ถ์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ค์ฒฉ ์ฌ์ฉ๋ ๊ฐ๋ฅํด์!
์ผํญ ์ฐ์ฐ์๋ฅผ ์ฌ๋ฌ ๊ฐ ์ฐ๊ฒฐํ์ฌ else if์ ๋น์ทํ ๊ตฌ๋ฌธ์ ๋ง๋ค ์๋ ์์ต๋๋ค.
const age = 15;
const message = age < 8 ? '์ด๋ฆฐ์ด ์
๋๋ค' :
age < 18 ? '์ฒญ์๋
์
๋๋ค' :
'์ฑ์ธ ์
๋๋ค';
console.log(message); // '์ฒญ์๋
์
๋๋ค'
๋ค๋ง, ์ค์ฒฉ์ด ๋๋ฌด ๊น์ด์ง๋ฉด ์คํ๋ ค ๊ฐ๋
์ฑ์ ํด์น ์ ์์ผ๋ 2~3๊ฐ ์ ๋์ ์กฐ๊ฑด์์๋ง ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค. ๊ทธ ์ด์ ๋ณต์กํด์ง๋ฉด if...else if ๋ฌธ์ด๋ switch ๋ฌธ์ด ๋ ๋์ ์ ํ์ผ ์ ์์ด์.
2. ์ต์
๋ ์ฒด์ด๋ (Optional Chaining): ๊ฐ์ฒด?.์์ฑ
์ต์
๋ ์ฒด์ด๋(?.)์ ES2020(ES11)์์ ๋์
๋ ๋น๊ต์ ์ต์ ๋ฌธ๋ฒ์ผ๋ก, ์ค๋ฌด์์ ์ ๋ง ์ฌ๋๋ฐ๋ ๊ธฐ๋ฅ ์ค ํ๋์
๋๋ค. ์ด ๊ธฐ๋ฅ์ ๊ฐ์ฒด์ ์์ฑ์ ์ ๊ทผํ ๋, ํด๋น ๊ฐ์ฒด๋ ๊ทธ ์์ ์์ฑ์ด null ๋๋ undefined์ผ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ ๋์ undefined๋ฅผ ๋ฐํํด ์ค๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ฒ์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐ์์ ํ๋กํ ์ฌ์ง์ ๋ณด์ฌ์ค์ผ ํ๋ ์ํฉ์ ์๊ฐํด ๋ด ์๋ค.
const user = {
name: "์กฐ์ด",
// profile ๊ฐ์ฒด๊ฐ ์์ ์๋ ์์
};
// ์ต์
๋ ์ฒด์ด๋์ด ์๋ค๋ฉด?
// const profileImage = user.profile.image; // TypeError: Cannot read properties of undefined (reading 'image')
์ ์ฝ๋์์ user ๊ฐ์ฒด์๋ profile ์์ฑ์ด ์๊ธฐ ๋๋ฌธ์ user.profile์ undefined๊ฐ ๋๊ณ , undefined์์ image ์์ฑ์ ์ฐพ์ผ๋ ค ํ๋ TypeError๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ฐ ์๋ฌ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฉ์ถ๊ฒ ํ ์ ์์ฃ .
๊ณผ๊ฑฐ์๋ ์ด๋ฐ ์๋ฌ๋ฅผ ๋ง๊ธฐ ์ํด if ๋ฌธ์ด๋ && ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
// 1. if ๋ฌธ์ผ๋ก ์ฒดํฌ
let profileImage;
if (user && user.profile) {
profileImage = user.profile.image;
}
// 2. && ์ฐ์ฐ์๋ก ์ฒดํฌ
const profileImageAnd = user && user.profile && user.profile.image;
ํ์ง๋ง ์ต์ ๋ ์ฒด์ด๋์ ์ฌ์ฉํ๋ฉด ์ด ์ฝ๋๊ฐ ๋ง๋ฒ์ฒ๋ผ ๊ฐ๋จํด์ง๋๋ค.
const user = {
name: "์กฐ์ด",
};
const profileImage = user.profile?.image;
console.log(profileImage); // undefined (์๋ฌ ๋ฐ์ X)
user.profile์ด undefined์ด๋ฏ๋ก ?. ์ฐ์ฐ์๋ ์ฆ์ ํ๊ฐ๋ฅผ ๋ฉ์ถ๊ณ undefined๋ฅผ ๋ฐํํฉ๋๋ค. ๋๋ถ์ ๋ฐํ์ ์๋ฌ ์์ด ์์ ํ๊ฒ ๊ฐ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋ ๊ฒ์ด์ฃ ! ๊ฐ์ฒด ์์ฑ๋ฟ๋ง ์๋๋ผ ๋ฐฐ์ด ์์(arr?.[index])๋ ํจ์ ํธ์ถ(func?.())์๋ ์ฌ์ฉํ ์ ์์ด ํ์ฉ๋๊ฐ ๋งค์ฐ ๋์ต๋๋ค.
3. ๋๋ฆฌ์ฌ ์ฝ๋ ์ฑ (Nullish Coalescing): ๊ฐ1 ?? ๊ฐ2
๋๋ฆฌ์ฌ ์ฝ๋ ์ฑ(??), ํ๊ตญ์ด๋ก๋ 'null ๋ณํฉ ์ฐ์ฐ์โ๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ด ๋ฌธ๋ฒ๋ ์ต์
๋ ์ฒด์ด๋๊ณผ ํจ๊ป ES2020์ ๋์
๋์์ต๋๋ค. ์ด ์ฐ์ฐ์๋ ์ผ์ชฝ ํผ์ฐ์ฐ์๊ฐ **null ๋๋ undefined**์ผ ๊ฒฝ์ฐ์๋ง ์ค๋ฅธ์ชฝ ํผ์ฐ์ฐ์๋ฅผ ๋ฐํํ๊ณ , ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ ์ผ์ชฝ ํผ์ฐ์ฐ์๋ฅผ ๊ทธ๋๋ก ๋ฐํํฉ๋๋ค.
๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ ๋ ์์ฃผ ์ ์ฉํ๊ฒ ์ฐ์ด๋๋ฐ, ํํ ์ฌ์ฉ๋๋ ๋
ผ๋ฆฌ์ OR ์ฐ์ฐ์(||)์ ๋จ์ ์ ๋ณด์ํด ์ค๋๋ค.
|| ์ฐ์ฐ์์์ ์ฐจ์ด์
|| ์ฐ์ฐ์๋ ์ผ์ชฝ ํผ์ฐ์ฐ์๊ฐ โfalsyโ ๊ฐ์ผ ๋ ์ค๋ฅธ์ชฝ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ falsy ๊ฐ์๋ null, undefined๋ฟ๋ง ์๋๋ผ 0, ""(๋น ๋ฌธ์์ด), false, NaN๋ ํฌํจ๋ฉ๋๋ค.
์ด ๋๋ฌธ์ ์๋์น ์์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์ค์ ํ ๊ฐ์ด 0์ด๋ ๋น ๋ฌธ์์ด์ธ๋ฐ ์ด๋ฅผ ์ ํจํ ๊ฐ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ถ์ ๋ ||๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
let height = 0;
console.log(height || 100); // 100
// height๊ฐ 0(falsy)์ด๋ฏ๋ก 100์ด ์ถ๋ ฅ๋จ. ์๋ํ ๋์์ด ์๋ ์ ์์.
์ด๋ฐ ์ํฉ์์ ๋๋ฆฌ์ฌ ์ฝ๋ ์ฑ(??)์ด ๋น์ ๋ฐํฉ๋๋ค. ??๋ ์ค์ง null๊ณผ undefined๋ง ์ฒดํฌํ๊ธฐ ๋๋ฌธ์ด์ฃ .
let height = 0;
let text = "";
console.log(height ?? 100); // 0 (height๋ null์ด๋ undefined๊ฐ ์๋๋ฏ๋ก ๊ทธ๋๋ก 0์ ๋ฐํ)
console.log(text ?? "๊ธฐ๋ณธ๊ฐ"); // "" (text๋ null์ด๋ undefined๊ฐ ์๋๋ฏ๋ก ๊ทธ๋๋ก ๋น ๋ฌธ์์ด์ ๋ฐํ)
let missingValue = null;
console.log(missingValue ?? "๊ธฐ๋ณธ๊ฐ"); // "๊ธฐ๋ณธ๊ฐ"
์ด์ฒ๋ผ ??๋ฅผ ์ฌ์ฉํ๋ฉด 0์ด๋ "" ๊ฐ์ ์ ํจํ ๊ฐ์ ์ ์งํ๋ฉด์ null ๋๋ undefined์ผ ๋๋ง ์์ ํ๊ฒ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
์ฐ์ฐ์ ์กฐํฉ ์ ์ฃผ์์ฌํญ
?? ์ฐ์ฐ์๋ ๋ค๋ฅธ ๋
ผ๋ฆฌ ์ฐ์ฐ์(&&, ||)์ ํจ๊ป ์ฌ์ฉํ ๋ ๊ดํธ ์์ด๋ ์ฌ์ฉํ ์ ์๋๋ก ๋ช
์ธ์ ์ ์๋์ด ์์ต๋๋ค. ์ด๋ ๊ฐ๋ฐ์์ ์ค์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํจ์
๋๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉํ๋ ค๋ฉด ๋ฐ๋์ ๊ดํธ๋ก ์ฐ์ ์์๋ฅผ ๋ช
ํํ๊ฒ ์ง์ ํด ์ฃผ์ด์ผ ํฉ๋๋ค.
// let x = 1 && 2 ?? 3; // SyntaxError ๋ฐ์!
let x = (1 && 2) ?? 3; // ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ๋ฒ
console.log(x); // 2
์ ๋ฆฌํ๋ฉฐ: ๋ฌผ์ํ์ ์นํด์ง๊ธฐ
์ง๊ธ๊น์ง ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฌผ์ํ(?)๊ฐ ์ฌ์ฉ๋๋ ์ธ ๊ฐ์ง ํต์ฌ ๋ฌธ๋ฒ์ ์ดํด๋ณด์์ต๋๋ค.
- ์ผํญ ์ฐ์ฐ์ (
? :):if...else๋ฅผ ํ ์ค๋ก ์ค์ฌ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค. - ์ต์
๋ ์ฒด์ด๋ (
?.): ๊ฐ์ฒด์ ์ค์ฒฉ๋ ์์ฑ์ ์ ๊ทผํ ๋null์ด๋undefined๋ก ์ธํ ์๋ฌ๋ฅผ ๋ฐฉ์งํ๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค. - ๋๋ฆฌ์ฌ ์ฝ๋ ์ฑ (
??): ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ ํ ๋นํ ๋,0์ด๋""๊ณผ ๊ฐ์ falsy ๊ฐ์ ์ ํจํ ๊ฒ์ผ๋ก ์ธ์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค.
์ด ์ธ ๊ฐ์ง ๋ฌธ๋ฒ์ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์ ์ฝ๋์ ์์ ์ฑ๊ณผ ๊ฐ๋
์ฑ์ ํฌ๊ฒ ํฅ์์ํค๋ ํ์์ ์ธ ๋๊ตฌ์
๋๋ค. ์ฒ์์๋ ์กฐ๊ธ ๋ฏ์ค ์ ์์ง๋ง, ๋ช ๋ฒ๋ง ์ง์ ์ฌ์ฉํด ๋ณด๋ฉด ๊ธ๋ฐฉ ์ต์ํด์ง๊ณ ๊ทธ ํธ๋ฆฌํจ์ ๋งค๋ฃ๋ ๊ฑฐ์์. ์ด์ ์ฌ๋ฌ๋ถ์ ์ฝ๋์์ ๋ณต์กํ if ๋ฌธ๊ณผ && ์ฒด์ธ์ ์ธ๋ จ๋ ๋ฌผ์ํ ๋ฌธ๋ฒ์ผ๋ก ๋ฐ๊ฟ๋ณด์ธ์!