front/react

[ES6] ๊ธฐ์ดˆ ์ •๋ฆฌ

๋ฐฐ๊ณ ํŒŒ์š” 2025. 12. 27. 12:24
728x90

๐Ÿ“ JS์—์„œ๋„ ํด๋ž˜์Šค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

  • constructor
    • --> JS ์—์„œ ํด๋ž˜์Šค ์ƒ์„ฑํ•  ๋•Œ ์“ฐ๋Š” ํ•จ์ˆ˜. --> ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€ --> ๋ถˆ๋ณ€. 
    • ์„ ์–ธํ•˜๋ฉด ๋ฐ”๋กœ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ๊ธฐ๋‚˜๋ด„.
<script>
class Car{
        constructor(car_brand){ // ํด๋ž˜์Šค ์ƒ์„ฑ์ž
            this.brand = car_brand;
        }

        hello(){
            return `์ œ ์ฐจ์˜ ๋ธŒ๋žœ๋“œ๋Š” ${this.brand} ์ž…๋‹ˆ๋‹ค.`
        }
    }
const mycar = new Car("Hyundae");
console.log("mycar.brand. --  " + mycar.brand); // mycar.brand. --  Hyundae


let hello = mycar.hello();
console.log(hello); // ์ œ ์ฐจ์˜ ๋ธŒ๋žœ๋“œ๋Š” Hyundae ์ž…๋‹ˆ๋‹ค.


class Model extends Car{
    constructor(car_brand, car_model){ //์ƒ์„ฑ์ž ๋งค๊ฐœ๋ณ€์ˆ˜ 2๊ฐœ ๋„ฃ์„ ์ˆ˜๋„ ์žˆ์ง€.
        super(car_brand); 
        this.model = car_model;
    }
    hi(){
        return this.hello() + `, ์ฐจ์ข…์€ ${this.model} ์ž…๋‹ˆ๋‹ค. `;
    }
}

const mycarmodel = new Model("Hyundae", "์บ์Šคํผ");
let hi = mycarmodel.hi();
console.log(hi); // ์ œ ์ฐจ์˜ ๋ธŒ๋žœ๋“œ๋Š” Hyundae ์ž…๋‹ˆ๋‹ค., ์ฐจ์ข…์€ ์บ์Šคํผ ์ž…๋‹ˆ๋‹ค. 

</script>
  • ์ฐธ๊ณ  
    • ๋งฅ๋ถ์—์„œ ๋ฐฑํ‹ฑ  :: optionํ‚ค + ๋ฐฑํ‹ฑ

 


 

 

๐Ÿ“ ํ™”์‚ดํ‘œํ•จ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜


<script>
    hello = function (){
        return "๊ณต๋ถ€ ํ™”์ดํŒ…!!";
    }

    let a = hello();
    console.log(a);

    arrowHello = () => {
        return "ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ";
    }

    let b = arrowHello();
    console.log(b);

    moreComfortable = () => "๋” ๊ฐ„๊ฒฐํžˆ ํ‘œํ˜„";
    console.log( moreComfortable() );

    // ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜
    arHello = (val) => `${val} ํ™”์ดํŒ…!!`;
    console.log( arHello("์•ˆ๋…•!! ") );

    // ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜๋ผ๋ฉด, ๋งค๊ฐœ๋ณ€์ˆ˜ ์•ž์— ๊ด„ํ˜ธ๊นŒ์ง€๋„ ์ƒ๋žต ๊ฐ€๋Šฅ.
    arHello = val => `${val} ํ™”์ดํŒ…์ด์•ผ!!`;
    console.log( arHello("์•ˆ๋…•ํ•˜์„ธ์š”!! ") );
</script>

 

 

 

๐Ÿ“ ์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ this vs. ํ™”์‚ดํ‘œํ•จ์ˆ˜์˜ this

<script>
this.name = "์ „์—ญ ๋ณ€์ˆ˜์—์„œ์˜ name !!"; 
// ์ „์—ญ์— this.name ์ด ์žˆ์œผ๋ฉด ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ ๋ถˆ๋Ÿฌ์ง.
const obj = {
    name: "์™•์ดˆ๋ณด ํ™ˆํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ",
    normalFunc : function() { // ์ผ๋ฐ˜ ํ•จ์ˆ˜ // this :: ํ˜ธ์ถœํ•œ ๊ฐ์ฒด(obj)
        console.log("normalFunc this.name. :  ", this.name); // normalFunc this.name. :  "์™•์ดˆ๋ณด ํ™ˆํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ"
        // obj์— ๋Œ€ํ•œ ๊ฒŒ this ๋กœ ๋‚˜์˜ด. 
        console.log(this); // {name: "์™•์ดˆ๋ณด ํ™ˆํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ", normalFunc: function, arrowFunc: function}
    },
    arrowFunc : () => { // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ // this :: ์ •์˜๋œ ์œ„์น˜์˜ this.
        // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ž๊ธฐ ์ž์‹ ์˜ this ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์Œ. 
        // ์ž๊ธฐ๊ฐ€ ์„ ์–ธ๋œ ์œ„์น˜์˜ this ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ด.
        // arrowFunc ๋Š” ** ์ „์—ญ ์Šค์ฝ”ํ”„ ** ์—์„œ ๋งŒ๋“ค์–ด์ง.
        // ์ „์—ญ์˜ ** this ** ๋ฅผ ์‚ฌ์šฉํ•จ.
        console.log("arrowFunc  this.name... :  ", this.name); // arrowFunc  this.name... :  "์ „์—ญ ๋ณ€์ˆ˜์—์„œ์˜ name !!"
        // window์— ๋Œ€ํ•œ ๊ฒŒ this ๋กœ ๋‚˜์˜ด.
        console.log(this); // Window {document: #document, NaN: NaN, window: Window, Infinity: Infinity, undefined: undefined, …}
        
    } 
};

obj.normalFunc();
obj.arrowFunc();

</script>

 

 

๐Ÿ“ var , let , const ์ฐจ์ด์ .

  var let const
scope function scope block scope block scope
์žฌ์„ ์–ธ (์ค‘๋ณต์„ ์–ธ) ๊ฐ€๋Šฅ ๋ถˆ๊ฐ€ ๋ถˆ๊ฐ€
์žฌํ• ๋‹น (์ด๋ฏธ ๋งŒ๋“  ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ƒˆ๋กญ๊ฒŒ ๋„ฃ๊ธฐ) ๊ฐ€๋Šฅ ๊ฐ€๋Šฅ ๋ถˆ๊ฐ€

 

<body>
    <div id="aaa">aaa</div>  
<script>
    // var, let ์˜ ์ฐจ์ด
    // scope ์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Œ.
    if(true){
        var x = 10;
        let l = 10;
        console.log("l -- " + l); // l -- 10
    }
    console.log(x); // 10
    // console.log(l); // ReferenceError: Can't find variable: l
    // var ๋Š” function ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง. 
    // let ์€ block scope ๋ฅผ ๊ฐ€์ง. 

    // hoisting ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ, ํ˜ธ์ด์ŠคํŒ…
    console.log(a);
    var a = 5;
    /*
    undefined ๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ. ์ด๊ฑด ์‚ฌ์‹ค์ƒ
    var a;
    console.log(a);
    var a = 5; 
    ์™€ ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ ๋จ. 
    ์•„์ง a๊ฐ’์ด ์ฑ„์›Œ์ง€์ง€ ์•Š์€ ์ƒํƒœ์—์„œ console ์— ์ฐ์€ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค ์ƒ๊ฐํ•˜๋ฉด ๋จ.
    */
    //console.log(b); // ReferenceError: Cannot access uninitialized variable.
    let b = 10; // TDZ :: Temporal Dead Zone :: ์ผ์‹œ์  ์‚ฌ๊ฐ ์ง€๋Œ€.
    /*
    ์‹ค์ œ์ ์œผ๋กœ๋Š” 
    let b;
    console.log(b);
    let b= 10; ๊ณผ ๊ฐ™๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, 
    var ์—์„œ๋Š” undefined ๋กœ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜๋Š”๋ฐ, let ์—์„œ๋Š” ์ดˆ๊ธฐํ™”๊ฐ€ ์•ˆ๋œ๋‹ค๋Š” ์ .
    */

    // var ๋Š” ๊ฐ™์€ scope ๋‚ด์—์„œ ์ค‘๋ณต ์„ ์–ธ ๊ฐ€๋Šฅ.
    var c = 1;
    var c = 2;
    console.log(c); // 2 

    /*
    // let ์€ ๊ฐ™์€ scope ๋‚ด์—์„œ ์ค‘๋ณต ์„ ์–ธ ๋ถˆ๊ฐ€๋Šฅ. 
    let d = 1;
    let d = 2;
    console.log(d); // SyntaxError: Cannot declare a let variable twice: 'd'.
    */

    var e = 100;
    console.log(window.e); // 100

    let f = 100;
    console.log(window.f); // undefined

    // const ์—์„œ๋Š” ๊ฐ’์„ ์žฌํ• ๋‹น ๋ถˆ๊ฐ€. // ํ•œ๋ฒˆ ์ •ํ•˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Œ.
    const g = 1;
    // g = 2;
    // console.log(g); // TypeError: Attempted to assign to readonly property.

    const aaa = document.getElementById("aaa");
    console.log("aaa - 1 :: ", aaa);
    aaa.innerHTML = "bbb";
    console.log("aaa - 2 :: ", aaa);
    // const ๋Š” ์œ„์น˜๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์จ์•ผํ•จ. 
    // ์ฐธ์กฐํ•˜๋Š” ์œ„์น˜ (div ๋“ฑ๋“ฑ) ์˜ ์†์„ฑ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ์ƒ๊ด€์—†์Œ.
</script>

</body>

 

 

 


 

๐Ÿ“ js ์—์„œ์˜ map ์€ ๋ฐฐ์—ด์˜ ๋งค์„œ๋“œ์ž„.

  • ๊ฐ ์š”์†Œ๋ฅผ ๊ฐ€๊ณตํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ฆ
<script>
    const numbers = [1,2,3,4];
    const doubled = numbers.map ( x => x * 2 );
    console.log(doubled);
    /* Array (4)
        0 2
        1 4
        2 6
        3 8
    */
    
</script>

 

๐Ÿ“ ๋ฆฌ์•กํŠธ์—์„œ๋Š” map ๋ฉ”์„œ๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์“ฐ๋‚˜??? 

import { createRoot } from 'react-dom/client'

const fruitlist = ['apple', 'banana', 'orange'];

function MyList() {
  return (
    <ul>
      {fruitlist.map(fruit => 
          <li key={fruit}>{fruit}</li>
      )}
    </ul>
  );
}

createRoot(document.getElementById('root')).render(
  <MyList /> 
)

 


๐Ÿ“ โญ๏ธโญ๏ธ js ์—๋„ ์ž๋ฐ”์˜ Map ์ด ์žˆ์Œ.

  • const map = new Map();  // ํ˜•ํƒœ๋กœ ์”€.
  • map.set("a", 1);
    map.set("b", 2);
    console.log(map.get("a")); // 1
  •  

 


 

๐Ÿ“ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น 

<script>
    // ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น
    const human = ['ํ™๊ธธ๋™', '๋‚จ์ž', '22'];

    // ๊ณผ๊ฑฐ๋ฐฉ์‹
    const o_name = human[0];
    const o_gender = human[1];
    const o_age = human[2];
    console.log(o_gender); // ๋‚จ์ž

    // ์‹ ๊ทœ.
    const [name1, gender1, age1] = human;
    console.log(gender1); // ๋‚จ์ž

    const [name, , age] = human;
    console.log(name); // ํ™๊ธธ๋™

    function dateInfo(d){
        const date = d.getDate();
        const month = d.getMonth() +1;
        const year = d.getFullYear();
        return [date, year, month];
    }
    const [date, month, year] = dateInfo( new Date() );
    console.log(date, month); // 27 2025
    // ๋ฐฐ์—ด๋กœ ํ•ด์„œ return ๋˜๋Š” ๊ฑฐ๋ผ์„œ, ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•จ.
    // ------------------------------- //
    // person ๊ฐ์ฒด ์„ ์–ธ.
    const person = {
        p_name : "ํ™๊ธธ๋™",
        p_gender : "man",
        p_age : 22
    }
    let {p_name, p_gender} = person;
    let {p_age, country = "ํ•œ๊ตญ"} = person;
    console.log(p_gender, p_age, country); // man 22 "ํ•œ๊ตญ"
    // ๊ฐ์ฒด์—์„œ๋Š” ์ˆœ์„œ์— ์ƒ๊ด€ ์—†๊ณ , ํ•œ๊ฐœ๋งŒ ์ถ”์ถœ๋„ ๊ฐ€๋Šฅ.

</script>

 

 


 

๐Ÿ“ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž

  • โญ๏ธโญ๏ธ const numbers = [one, two, ...rest]; 
  • ์Šคํ”„๋ ˆ๋“œํ•  ๋•Œ, ๊ฐ™์€ key ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด --> ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ณ€๊ฒฝ๋จ.
// ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž
const a = [1,2,3];
const b = [4,5,6];

const c = [...a, ...b];
console.log(c); // [1, 2, 3, 4, 5, 6] 

const numbers = [1,2,3,4,5];
const [one, two, ...rest] = numbers;
console.log(one, two, rest, rest[2]); // 1 - 2 - [3, 4, 5] - 5

๐Ÿ“ โญ๏ธโญ๏ธโญ๏ธ ์–•์€ ๋ณต์‚ฌ ์ž„.

// ๊ฐ์ฒด์—์„œ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉํ•˜๊ธฐ
const man1 = {
    name : "ํ™๊ธธ๋™",
    address : "์„œ์šธ",
    age : 22,
    info : { type : "good" } // ** ๊ฐ์ฒด ์•ˆ์— ๊ฐ์ฒด๊ฐ€ ๋˜ ์žˆ์–ด!! ์—ฌ๊ธฐ ์ฃผ์˜!! **
}

const man2 = {
    name : "๋‘˜๋ฆฌ",
    brithday : "1996-01-24",
    gender : "๋‚จ"
}

const man = {...man1, ...man2};
console.log(man); // {name: "๋‘˜๋ฆฌ", address: "์„œ์šธ", age: 22, brithday: "1996-01-24", gender: "๋‚จ"}
// ์ค‘๋ณต๋œ key ๊ฐ’์ด ์žˆ์œผ๋ฉด, ๋งˆ์ง€๋ง‰๊ป„๋กœ ๋ฎ์–ด์จ์ง.
console.log(man1.name); // ํ™๊ธธ๋™
man.name = "์ฝฉ์ˆœ์ด";
console.log(man1.name); // ํ™๊ธธ๋™
console.log(man2.name); // ๋‘˜๋ฆฌ
console.log(man.name); // ์ฝฉ์ˆœ์ด

// ์–•์€ ๋ณต์‚ฌ ์ฃผ์˜ !!! ::  ๊ฐ์ฒด ์•ˆ์— ๋˜ ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ "์ฐธ์กฐ"๊ฐ€ ๊ณต์œ ๋จ
console.log(man1.info.type); // good
console.log(man.info.type); // good
man.info.type = "bad";
console.log(man1.info.type); // bad
console.log(man.info.type); // bad

 

 


 

๐Ÿ“๋ชจ๋“ˆ

  • module์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ!! ๊ผญ      <script type="module">   ์„ ์–ธํ•ด์ฃผ๊ธฐ !! 
  •  
๊ตฌ๋ถ„ default export named export
์—ฌ๋Ÿฌ๊ฐœ export  ํ•˜๋‚˜๋งŒ ๊ฐ€๋Šฅํ•จ!  ์—ฌ๋Ÿฌ๊ฐœ ๊ฐ€๋Šฅ!
import ์ด๋ฆ„ ๋™์ผ ์—ฌ๋ถ€ ์ž์œ ๋กญ๊ฒŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ๋ฐ˜๋“œ์‹œ ๋™์ผํ•˜๊ฒŒ ! 
๋‚ด ์ฝ”๋“œ์—์„œ ๋ฌด์—‡? message.js ์—์„œ 
export default message;
์„ ์–ธํ•œ ๋ถ€๋ถ„!!
person.js ์—์„œ
export const ~ ;
export {} 
์„ ์–ธํ•œ ๋ถ€๋ถ„!!
<script type="module">
import { name2, age } from "./person.js";
// alert(`๋‚ด ์ด๋ฆ„์€ ${name2} ์ด๊ณ , ๋‚˜์ด๋Š” ${age} ์ž…๋‹ˆ๋‹ค!`, {name2}, {age} );
console.log( age, name2 ); // 22 - ๋‘˜๋ฆฌ
</script>


<script type="module">
import mess from "./message.js"; // import ์ด๋ฆ„์€ ๋ฐ”๊ฟ”๋„ ๋จ.
//alert( mess() );
console.log( mess() ); // ํ™๊ธธ๋™์€ 22์„ธ ์ž…๋‹ˆ๋‹ค
</script>
// person.js

// ๋ณ€์ˆ˜๋ฅผ export ํ•˜๊ธฐ
// ๋ฐฉ๋ฒ• 1
export const name = "ํ™๊ธธ๋™"
export const age = 22

// ๋ฐฉ๋ฒ• 2
const name2 = "๋‘˜๋ฆฌ"
const age2 = 30
export {name2, age2}



// message.js
// ํ•จ์ˆ˜๋ฅผ export ํ•˜๊ธฐ
const message = () => {
    const name = "ํ™๊ธธ๋™";
    const age = 22;
    return name + `์€ ` + age + `์„ธ ์ž…๋‹ˆ๋‹ค`;
}

export default message;

 


 

๐Ÿ“ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด

  • ๋ฐฑํ‹ฑ (`) ์‚ฌ์šฉํ•ด์„œ ๊ฐ’ ๋„ฃ๋Š” ๊ฑฐ! 
  • ํ…œํ”Œ๋ฆฟ ๋‚ด์—์„œ ๋ฐ”๋กœ ๊ณ„์‚ฐ ๊ฐ€๋Šฅ !! --> 
    let total = `ํ† ํƒˆ์€ ${price * quantity} ์ž…๋‹ˆ๋‹น`;
  • ์‚ผํ•ญ์—ฐ์‚ฐ์ž ๊ฐ€๋Šฅ !! --> 
    const message = `์–ด๋“œ๋ฏผ ์ƒํƒœ๊ฐ’ :: ${ !isAdmin ? '์–ด๋“œ๋ฏผ' : '์œ ์ ธ'}`;   

 

<pre class="demo"></pre>
<div class="demo"></div>

<script>
    const name = "ํ™๊ธธ๋™";
    const age = 30;
    const mess1 = "์•ˆ๋…•ํ•˜์„ธ์š”, " + name + "์ž…๋‹ˆ๋‹ค. \n๋‚˜์ด๋Š” " + age + "์ด์˜ˆ์šฉ!";

    console.log( mess1 ); 
    /* ์•ˆ๋…•ํ•˜์„ธ์š”, ํ™๊ธธ๋™์ž…๋‹ˆ๋‹ค. 
       ๋‚˜์ด๋Š” 30์ด์˜ˆ์šฉ! */

    const mess2 = `ํ•˜์ด๋ฃจ! ${name}๋‹˜
    ๋ฐฉ๊ฐ€๋ฐฉ๊ฐ€ ์ž…๋‹ˆ๋‹น! ๋‚˜์ด๋Š” ${age} ์ด๊ตฐ์šฉ!`;
    console.log(mess2);
    /* ํ•˜์ด๋ฃจ! ํ™๊ธธ๋™๋‹˜
            ๋ฐฉ๊ฐ€๋ฐฉ๊ฐ€ ์ž…๋‹ˆ๋‹น! ๋‚˜์ด๋Š” 30 ์ด๊ตฐ์šฉ!
    */

    //document.getElementsByClassName("demo")[0].innerHTML = mess;
    document.querySelectorAll(".demo").forEach( (el,idx) => {
        el.innerHTML = eval("mess" + (idx+1));
    });

    let price = 1000;
    let quantity = 7;
    let total = `ํ† ํƒˆ์€ ${price * quantity} ์ž…๋‹ˆ๋‹น`;
    console.log(total); // ํ† ํƒˆ์€ 7000 ์ž…๋‹ˆ๋‹น

    const isAdmin = true;
    const message = `์–ด๋“œ๋ฏผ ์ƒํƒœ๊ฐ’ :: ${ !isAdmin ? '์–ด๋“œ๋ฏผ' : '์œ ์ ธ'}`;
    console.log(message); // ์–ด๋“œ๋ฏผ ์ƒํƒœ๊ฐ’ :: ์œ ์ ธ
</script>

 

 

 


์ถœ์ฒ˜ : 

https://www.youtube.com/watch?v=JNMarqNQQv4&list=PLTb3qGCzYjS2AliTIbz9eAGjZSdEQa3m1&index=2

https://powerdev.tistory.com/68#google_vignette

 


๊ฐœ๋ฐœ ๊ณต๋ถ€๋ฅผ ์œ„ํ•œ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค. 

์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”! 

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

728x90