๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Dev/Language

[JavaScript] ๋ณ€์ˆ˜ ์„ ์–ธ | ๋ฐ์ดํ„ฐ ํƒ€์ž… | ์—ฐ์‚ฐ์ž | ์กฐ๊ฑด๋ฌธ | ๋ฐ˜๋ณต๋ฌธ

by haerr 2024. 9. 24.

๋ชฉ์ฐจ!

 

๐Ÿ“ ๋ณ€์ˆ˜ ์„ ์–ธ

var: ํ‹€๋”ฑ๋ฐฉ์‹

let: ๊ฐ’ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜

const: ๊ฐ’ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜ (์ƒ์ˆ˜ํ™”)

let age = 25;
const name = "John";
var isStudent = true; // ์ง€์–‘

๐Ÿ”ก ๋ฐ์ดํ„ฐํƒ€์ž…

์›์‹œ ๋ฐ์ดํ„ฐ ํƒ€์ž… (Primitive Data Types)

  1. Number (์ˆซ์ž)
    • ์ •์ˆ˜์™€ ๋ถ€๋™์†Œ์ˆ˜์  ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ํ‘œํ˜„
    let age = 25;       // ์ •์ˆ˜
    let price = 19.99;  // ๋ถ€๋™์†Œ์ˆ˜์ 
    
    • ํŠน๋ณ„ํ•œ ๊ฐ’๋“ค:
      • ∞, -∞: 0์œผ๋กœ ๋‚˜๋ˆ„๊ฑฐ๋‚˜ ๋งค์šฐ ํฐ ์ˆซ์ž๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
      • NaN (Not-a-Number == ๋ถ€์ •ํ˜•): ์ˆ˜ํ•™์  ์—ฐ์‚ฐ์ด ์‹คํŒจํ•  ๋•Œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค (์˜ˆ: ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋‚˜๋ˆ„๋ ค ํ•  ๋•Œ).
  2. String (๋ฌธ์ž์—ด)
    • ํ…์ŠคํŠธ๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ
    • ๋ฌธ์ž์—ด์€ ์ž‘์€ ๋”ฐ์˜ดํ‘œ('...'), ํฐ ๋”ฐ์˜ดํ‘œ("..."), ๋˜๋Š” ๋ฐฑํ‹ฑ(...)์œผ๋กœ ๊ฐ์Œ‰๋‹ˆ๋‹ค.
    let name = "Alice";         // ํฐ ๋”ฐ์˜ดํ‘œ
    let greeting = 'Hello!';    // ์ž‘์€ ๋”ฐ์˜ดํ‘œ
    let message = `Hi, ${name}`; // ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด (๋ฐฑํ‹ฑ)
    
    <aside> <img src="/icons/username_lightgray.svg" alt="/icons/username_lightgray.svg" width="40px" />
    • length
    • [ ]
    • indexOf
    • slice
    • toLowerCase()
    • toUpperCase()
    • replace </aside>
    let str = "Hello";
    
    str.length; // == len(str)
    str[0];
    str.indexOf("ll") //"ll"์˜ ์‹œ์ž‘ ์œ„์น˜ ๋ฐ˜ํ™˜. ํฌํ•จ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ -1 ๋ฐ˜ํ™˜
    str.slice(0, 3) // 0๋ฒˆ์งธ๋ถ€ํ„ฐ 3๊ฐœ์˜ ๋ฌธ์ž์—ด ์ถ”์ถœ -> hel
    str.slice(2) // 2๋ฒˆ์งธ๋ถ€ํ„ฐ ๋๊นŒ์ง€ -> llo
    str.replace("์›๋ž˜ ๋ฌธ์ž์—ด", "๋Œ€์ฒด ๋ฌธ์ž์—ด")
    
    
  3. String as objects
  4. Boolean (๋ถˆ๋ฆฌ์–ธ)
    • true ๋˜๋Š” false์˜ ๋…ผ๋ฆฌ ๊ฐ’
    • ์ฃผ๋กœ ์กฐ๊ฑด๋ฌธ๊ณผ ๋น„๊ต ์—ฐ์‚ฐ์—์„œ ์‚ฌ์šฉ
    let isAdmin = true;
    let isLoggedIn = false;
    
  5. Null (๋„)
    • ์˜๋„์ ์œผ๋กœ ๊ฐ’์ด ์—†์Œ์„ ํ‘œํ˜„
    let emptyValue = null;
    
  6. Undefined (์ •์˜๋˜์ง€ ์•Š์Œ)
    • ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜์—ˆ์ง€๋งŒ ์•„์ง ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ์•Š์•˜์„ ๋•Œ
    let notAssigned;
    console.log(notAssigned);  // undefined
    

 

null๊ณผ undefined์˜ ์ฐจ์ด

๊ณตํ†ต์ : ๊ฐ’์ด ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ„

null: ๊ฐ’์ด ์—†์Œ์„ ์˜๋„์ ์œผ๋กœ ๋‚˜ํƒ€๋ƒ„ ← ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •

undefined: ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ํ›„ ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ์•Š์Œ

 

  1. Symbol (์‹ฌ๋ณผ)
    • ๊ณ ์œ ํ•˜๊ณ  ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ’์œผ๋กœ, ์ฃผ๋กœ ๊ฐ์ฒด์˜ ์†์„ฑ ํ‚ค๋ฅผ ์ถฉ๋Œ ์—†์ด ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ
    let uniqueId = Symbol("id");

 

๋น„์›์‹œ ๋ฐ์ดํ„ฐ ํƒ€์ž… (๊ฐ์ฒด ํƒ€์ž…, Object)

  1. Object (๊ฐ์ฒด)
    • ํ‚ค-๊ฐ’ ์Œ์˜ ๋ชจ์Œ์œผ๋กœ, ๊ฐ’์€ ์–ด๋–ค ํƒ€์ž…์ด๋“  ๊ฐ€๋Šฅ
    let user = {
      name: "Alice",
      age: 30,
      isAdmin: true
    };
    • ๊ฐ์ฒด์˜ ํŠน๋ณ„ํ•œ ์ข…๋ฅ˜:
      • Array (๋ฐฐ์—ด): ๊ฐ’์˜ ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ํŠน๋ณ„ํ•œ ํƒ€์ž…์˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
      • let colors = ["red", "green", "blue"];
      • Function (ํ•จ์ˆ˜): ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋กœ, ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ ํƒ€์ž… ์„ค๋ช… ์˜ˆ์‹œ
Number ์ •์ˆ˜์™€ ๋ถ€๋™์†Œ์ˆ˜์  ์ˆซ์ž๋ฅผ ํ‘œํ˜„ let age = 25;
String ํ…์ŠคํŠธ๋ฅผ ํ‘œํ˜„ (๋ฌธ์ž์—ด) let name = "Alice";
Boolean true ๋˜๋Š” false์˜ ๋…ผ๋ฆฌ ๊ฐ’์„ ํ‘œํ˜„ let isAdmin = true;
Null ์˜๋„์ ์œผ๋กœ ๊ฐ’์ด ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ„ let value = null;
Undefined ๋ณ€์ˆ˜๊ฐ€ ๊ฐ’ ์—†์ด ์„ ์–ธ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ„ let notAssigned;
Symbol ๊ณ ์œ ํ•œ ์‹๋ณ„์ž let id = Symbol("id");
Object ํ‚ค-๊ฐ’ ์Œ์˜ ๋ชจ์Œ let user = {name: "Alice"};

 

โž• ์—ฐ์‚ฐ์ž

1. ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž (Arithmetic Operators)

์ˆซ์ž์— ๋Œ€ํ•ด ์ˆ˜ํ•™์  ์—ฐ์‚ฐ ์ˆ˜ํ–‰

์—ฐ์‚ฐ์ž ์„ค๋ช… ์˜ˆ์‹œ ๊ฒฐ๊ณผ

+ ๋ง์…ˆ 5 + 3 8
- ๋บ„์…ˆ 5 - 3 2
* ๊ณฑ์…ˆ 5 * 3 15
/ ๋‚˜๋ˆ—์…ˆ 9 / 3 3
% ๋‚˜๋จธ์ง€ 9 % 2 1 (๋‚˜๋จธ์ง€)
++ ์ฆ๊ฐ€ (1์”ฉ ์ฆ๊ฐ€) let x = 5; x++ 6
-- ๊ฐ์†Œ (1์”ฉ ๊ฐ์†Œ) let y = 5; y-- 4

 

2. ๋Œ€์ž… ์—ฐ์‚ฐ์ž (Assignment Operators)

๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹น

 

์—ฐ์‚ฐ์ž  ์„ค๋ช…  ์˜ˆ์‹œ  ๊ฒฐ๊ณผ
= ๊ฐ’ ํ• ๋‹น x = 10 x๊ฐ€ 10์ด ๋จ
+= ๋”ํ•œ ํ›„ ํ• ๋‹น x += 5 x = x + 5
-= ๋บ€ ํ›„ ํ• ๋‹น x -= 5 x = x - 5
*= ๊ณฑํ•œ ํ›„ ํ• ๋‹น x *= 5 x = x * 5
/= ๋‚˜๋ˆˆ ํ›„ ํ• ๋‹น x /= 5 x = x / 5
%= ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•œ ํ›„ ํ• ๋‹น x %= 5 x = x % 5

 

3. ๋น„๊ต ์—ฐ์‚ฐ์ž (Comparison Operators)

๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ๋…ผ๋ฆฌ์ ์ธ ๊ฒฐ๊ณผ (true ๋˜๋Š” false)๋ฅผ ๋ฐ˜ํ™˜

 

์—ฐ์‚ฐ์ž ์„ค๋ช… ์˜ˆ์‹œ ๊ฒฐ๊ณผ
== ๊ฐ’์ด ๊ฐ™์œผ๋ฉด true 5 == '5' true
=== ๊ฐ’๊ณผ ํƒ€์ž…์ด ๋ชจ๋‘ ๊ฐ™์œผ๋ฉด true 5 === '5' false
!= ๊ฐ’์ด ๋‹ค๋ฅด๋ฉด true 5 != 3 true
!== ๊ฐ’๊ณผ ํƒ€์ž…์ด ๋ชจ๋‘ ๋‹ค๋ฅด๋ฉด true 5 !== '5' true
> ์™ผ์ชฝ ๊ฐ’์ด ๋” ํฌ๋ฉด true 5 > 3 true
< ์™ผ์ชฝ ๊ฐ’์ด ๋” ์ž‘์œผ๋ฉด true 5 < 3 false
>= ์™ผ์ชฝ ๊ฐ’์ด ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด true 5 >= 5 true
<= ์™ผ์ชฝ ๊ฐ’์ด ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด true 5 <= 5 true

 

4. ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž (Logical Operators)

๋‘ ๊ฐœ ์ด์ƒ์˜ ์กฐ๊ฑด์„ ๊ฒฐํ•ฉํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋Œ€๋กœ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ

 

์—ฐ์‚ฐ์ž ์„ค๋ช… ์˜ˆ์‹œ ๊ฒฐ๊ณผ
&& AND ์—ฐ์‚ฐ: ๋‘ ์กฐ๊ฑด ๋ชจ๋‘ true์ผ ๋•Œ๋งŒ true true && false false
|| OR ์—ฐ์‚ฐ: ๋‘ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋งŒ true์—ฌ๋„ true true || false true
! NOT ์—ฐ์‚ฐ: ๊ฐ’์˜ ๋ฐ˜๋Œ€๋ฅผ ๋ฐ˜ํ™˜ !true false

 

5. ์‚ผํ•ญ ์—ฐ์‚ฐ์ž (Ternary Operator)

์กฐ๊ฑด์ด true์ธ์ง€ false์ธ์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜

ํ˜•์‹: condition ? expr1 : expr2

 

์—ฐ์‚ฐ์ž ์„ค๋ช… ์˜ˆ์‹œ ๊ฒฐ๊ณผ
? : ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด ์ฒซ ๋ฒˆ์งธ ๊ฐ’, ๊ฑฐ์ง“์ด๋ฉด ๋‘ ๋ฒˆ์งธ ๊ฐ’ let result = (age > 18) ? "Adult" : "Minor"; "Adult" ๋˜๋Š” "Minor"

 

6. ํƒ€์ž… ์—ฐ์‚ฐ์ž (Type Operators)

๊ฐ’์˜ ํƒ€์ž…์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์กฐ์ž‘

 

์—ฐ์‚ฐ์ž ์„ค๋ช… ์˜ˆ์‹œ ๊ฒฐ๊ณผ
typeof ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ฐ˜ํ™˜ typeof 123 "number"
instanceof ๊ฐ์ฒด๊ฐ€ ํŠน์ • ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€ ํ™•์ธ date instanceof Date true
new ์ƒˆ ๊ฐ์ฒด ์ƒ์„ฑ let person = new Object(); ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ

 

7. ๋น„ํŠธ ์—ฐ์‚ฐ์ž (Bitwise Operators)

์ˆซ์ž๋ฅผ 2์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋น„ํŠธ ๋‹จ์œ„๋กœ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰

 

์—ฐ์‚ฐ์ž ์„ค๋ช… ์˜ˆ์‹œ ๊ฒฐ๊ณผ
& AND 5 & 1 1
| OR 5 | 1 5
^ XOR 5 ^ 1 4
~ NOT ~5 -6
<< ์™ผ์ชฝ ์‹œํ”„ํŠธ 5 << 1 10
>> ์˜ค๋ฅธ์ชฝ ์‹œํ”„ํŠธ 5 >> 1 2

 

โ˜๏ธ ์กฐ๊ฑด๋ฌธ

1. if๋ฌธ

๊ตฌ๋ฌธ:

if (์กฐ๊ฑด) {
  // ์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
}

์˜ˆ์‹œ:

let age = 18;

if (age >= 18) {
  console.log("์„ฑ์ธ์ž…๋‹ˆ๋‹ค.");
}

2. else if๋ฌธ

๊ตฌ๋ฌธ:

if (์กฐ๊ฑด1) {
  // ์กฐ๊ฑด1์ด ์ฐธ์ผ ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
} else if (์กฐ๊ฑด2) {
  // ์กฐ๊ฑด2๊ฐ€ ์ฐธ์ผ ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
}

์˜ˆ์‹œ:

let score = 85;

if (score >= 90) {
  console.log("A ๋“ฑ๊ธ‰์ž…๋‹ˆ๋‹ค.");
} else if (score >= 80) {
  console.log("B ๋“ฑ๊ธ‰์ž…๋‹ˆ๋‹ค.");
} else {
  console.log("C ๋“ฑ๊ธ‰์ž…๋‹ˆ๋‹ค.");
}

3. else๋ฌธ

else๋Š” ๋ชจ๋“  if๋‚˜ else if ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ผ ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ:

if (์กฐ๊ฑด1) {
  // ์กฐ๊ฑด1์ด ์ฐธ์ผ ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
} else {
  // ์กฐ๊ฑด1์ด ๊ฑฐ์ง“์ผ ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
}

์˜ˆ์‹œ:

let temperature = 10;

if (temperature > 20) {
  console.log("๋‚ ์”จ๊ฐ€ ๋”ฐ๋œปํ•ฉ๋‹ˆ๋‹ค.");
} else {
  console.log("๋‚ ์”จ๊ฐ€ ์ถฅ์Šต๋‹ˆ๋‹ค.");
}

4. switch๋ฌธ

switch๋ฌธ์€ ํ•˜๋‚˜์˜ ํ‘œํ˜„์‹ ๊ฐ’์„ ์—ฌ๋Ÿฌ ์ผ€์ด์Šค์™€ ๋น„๊ตํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰

๊ตฌ๋ฌธ:

switch (ํ‘œํ˜„์‹) {
  case ๊ฐ’1:
    // ๊ฐ’1๊ณผ ํ‘œํ˜„์‹์ด ์ผ์น˜ํ•  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
    break;
  case ๊ฐ’2:
    // ๊ฐ’2์™€ ํ‘œํ˜„์‹์ด ์ผ์น˜ํ•  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
    break;
  default:
    // ๋ชจ๋“  ์ผ€์ด์Šค๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
}

์˜ˆ์‹œ:

let day = 2;

switch (day) {
  case 1:
    console.log("์›”์š”์ผ");
    break;
  case 2:
    console.log("ํ™”์š”์ผ");
    break;
  case 3:
    console.log("์ˆ˜์š”์ผ");
    break;
  default:
    console.log("์ฃผ๋ง์ž…๋‹ˆ๋‹ค.");
}

 

โฉ ๋ฐ˜๋ณต๋ฌธ

1. for๋ฌธ

for๋ฌธ์€ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์•Œ๊ณ  ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ์กฐ๊ฑด์ด ์ฐธ์ผ ๋™์•ˆ ๋ฐ˜๋ณต์„ ์ˆ˜ํ–‰

 

๊ตฌ๋ฌธ:

for (์ดˆ๊ธฐํ™”; ์กฐ๊ฑด; ์ฆ๊ฐ) {
  // ์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
}

์˜ˆ์‹œ:

for (let i = 0; i < 5; i++) {
  console.log(i); // 0, 1, 2, 3, 4 ์ถœ๋ ฅ

 

์ถ”๊ฐ€์ ์œผ๋กœ, for...of๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

ex) for (let num of arr)

 

2. while๋ฌธ

while๋ฌธ์€ ์กฐ๊ฑด์ด ์ฐธ์ธ ๋™์•ˆ ๋ฐ˜๋ณต์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ด ๋˜๋ฉด ๋ฐ˜๋ณต์ด ์ข…๋ฃŒ

 

๊ตฌ๋ฌธ:

while (์กฐ๊ฑด) {
  // ์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
}

์˜ˆ์‹œ:

let count = 0;

while (count < 5) {
  console.log(count);
  count++; // 0, 1, 2, 3, 4 ์ถœ๋ ฅ
}

3. do...while๋ฌธ

do...while๋ฌธ์€ ๋จผ์ € ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ ํ›„ ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•˜์—ฌ, ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด ๋ฐ˜๋ณต (์ตœ์†Œ ํ•œ ๋ฒˆ์€ ์‹คํ–‰)

๊ตฌ๋ฌธ:

do {
  // ์ฝ”๋“œ ์‹คํ–‰
} while (์กฐ๊ฑด);

์˜ˆ์‹œ:

let i = 0;

do {
  console.log(i);
  i++;
} while (i < 5); // 0, 1, 2, 3, 4 ์ถœ๋ ฅ

break์™€ continue

์˜ˆ์‹œ (break):

for (let i = 0; i < 5; i++) {
  if (i === 3) {
    break;  // 3์—์„œ ๋ฐ˜๋ณต ์ค‘๋‹จ
  }
  console.log(i);  // 0, 1, 2 ์ถœ๋ ฅ
}

์˜ˆ์‹œ (continue):

for (let i = 0; i < 5; i++) {
  if (i === 2) {
    continue;  // 2๋Š” ๊ฑด๋„ˆ๋œ€
  }
  console.log(i);  // 0, 1, 3, 4 ์ถœ๋ ฅ
}