[Javascript] this

Teasanยท2022๋…„ 7์›” 24์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
15/15
post-thumbnail

this


"์‹คํ–‰์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™” ๋์„ ๋•Œ ThisBinding์€ ์‹คํ–‰ ๋œ๋‹ค. "

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์ˆœ๊ฐ„์— this ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, ์‹คํ–‰์ปจํ…์ŠคํŠธ๋Š” ์–ธ์ œ ์ƒ์„ฑ ๋ ๊นŒ? ๋ฐ”๋กœ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์— ํ•ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ˆœ๊ฐ„์— ์ƒ์„ฑ ๋œ๋‹ค. ๊ทธ ๋ง์ธ ์ฆ‰์Šจ, this๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๊ฒฐ์ •๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. this ๋Š” ์ •์ ์œผ๋กœ ์ฝ”๋“œ๋งŒ ๋ดค์„ ๋•Œ ๋ฐ”๋กœ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์–ด๋–ค ์‹์œผ๋กœ ํ˜ธ์ถœํ–ˆ๋Š๋ƒ์— ๋”ฐ๋ผ์„œ ์–ผ๋งˆ๋“ ์ง€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋™์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

ThisBinding์€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๊ฒฐ์ •๋˜๊ณ (์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์ˆœ๊ฐ„), ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ this ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค๋Š” ๋œป์€ ๋ฌด์—‡์„ ์˜๋ฏธํ• ๊นŒ? ์œ„์˜ ํ‘œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

์ „์—ญ ๊ณต๊ฐ„์—์„œ this ๋Š”,

"์ „์—ญ ๊ฐ์ฒด"๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” window, node.js ์—์„œ๋Š” global ์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ „์—ญ ์ปจํ…์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ฃผ์ฒด๊ฐ€ ๋ฐ”๋กœ ์ „์—ญ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋ฉฐ, ์ด ์ „์—ญ ๊ฐ์ฒด๋ฅผ host ๊ฐ์ฒด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ console.log(this) ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด window ์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•˜๊ณ 
node.js ์—์„œ console.log(this)๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด global ์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์ด window ์™€ global ์€ ECMAScript ์—์„œ ์ •์˜ํ•œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ECMAScript๊ฐ€ ๋‚˜๋ฆ„์˜ ๋ฐฉ์‹์œผ๋กœ ์ •์˜ํ•ด๋†“์€ '์ „์—ญ ๊ฐ์ฒด' ๋‚ด์šฉ์— ๋”ฐ๋ผ์„œ '๋Ÿฐํƒ€์ž„์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ตฌํ˜„์ฒด' ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ , ๊ฐ host ํ™˜๊ฒฝ์—์„œ ์ •์˜ํ•œ ๋ฐ”์— ๋”ฐ๋ผ์„œ ์ „์—ญ ๊ฐ์ฒด์˜ ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์ด ๋‹ฌ๋ผ์ง„๋‹ค.


## ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ์— **this** ๋Š”, ### "์ „์—ญ ๊ฐ์ฒด"๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์—๋„ this ๋Š” '์ „์—ญ ๊ฐ์ฒด'๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋‹ˆ ์ด๊ฑด ๋ฌด์Šจ ์˜๋ฏธ์ผ๊นŒ? ์•„๋ž˜์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ˆœ๊ฐ„์— ์ด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๋Š” '์ฃผ์ฒด'๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๋Š” ๊ฒŒ ์ข€ ์‰ฝ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ์—์„œ a ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ „์—ญ ๊ณต๊ฐ„์—์„œ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, this ๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ฒˆ์—” ๋‹ค๋ฅธ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

function b() {
	function c() {
		console.log(this);
	}
	c();
}

b();

c ํ•จ์ˆ˜๋ฅผ ๋‹ด์•„์„œ c ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋Š” b ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ? ์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ์—์„œ๋Š” a๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฃผ์ฒด๊ฐ€ '์ „์—ญ ๊ฐ์ฒด' ์ด๊ธฐ์— this๊ฐ€ ์ „์—ญ ๊ฐ์ฒด๋ผ๋Š” ๊ฒƒ์€ ์‰ฝ๊ฒŒ ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” c ํ•จ์ˆ˜๋ฅผ b ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ์™€๋Š” ๋‹ค๋ฅธ ๊ฒฐ๊ณผ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ๋งŒ ๊ฐ™๋‹ค. ๊ฒฐ๊ณผ๋Š” ์–ด๋–จ๊นŒ.

c ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์ฃผ์ฒด๊ฐ€ b ํ•จ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ, this๋Š” ์—ฌ์ „ํžˆ '์ „์—ญ ๊ฐ์ฒด'๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ๊ทธ๊ฒƒ์„ ์ถœ๋ ฅํ•˜๊ณ  ์žˆ๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์•ฝ๊ฐ„์€ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒ ์ง€๋งŒ ์ดํ›„์— ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€์ฒด ๊ฐœ๋…(arrow function)์ด ES6 ์—์„œ ๋“ฑ์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฑ์ •์€ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ๋‹ค๋งŒ ํ•จ์ˆ˜๋กœ์จ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ this๋Š” ๋ฌด์กฐ๊ฑด ๊ทธ๋ฆฌ๊ณ  ์–ธ์ œ๋‚˜ '์ „์—ญ ๊ฐ์ฒด'๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋Š” ๊ฒƒ๋งŒ์€ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์ž.

๐Ÿ“ ์•ž์—์„œ ๊ฑฐ๋ก ํ–ˆ๋“ฏ์ด ์ด๋Ÿฌํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฌธ์ œ๋ผ๋Š” ์˜๊ฒฌ์ด ๋‹ค๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ECMAScript 6 ์—์„œ๋Š” ์•„์˜ˆ thisBinding์„ ํ•˜์ง€ ์•Š๋Š” arrow function ์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด arrow function์€ ๋ฐ”๋กœ ์œ„ ์ปจํ…์ŠคํŠธ์— ์žˆ๋Š” this ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ•œ๋‹ค.

let d = {
    e: function() {
        function f(){
            console.log(this);
        }
        f();
    }
};
d.e();

d ๊ฐ์ฒด ์•ˆ์— e ๋ผ๊ณ  ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜๊ณ , ๋ฉ”์„œ๋“œ๋กœ์„œ e๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

e ๋ฉ”์„œ๋“œ ์•ˆ์— f ๋ผ๊ณ  ํ•˜๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ , this๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜๋Š” ์ด ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ์—ญ์‹œ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ window ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ?

this๋ฅผ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์— ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜์ธ f๋ฅผ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋Š”์ง€(ํ˜ธ์ถœํ•œ ํ˜•ํƒœ)๋งŒ ๋ณด๋ฉด ๋œ๋‹ค. ์–ด์จŒ๋“  ํ•จ์ˆ˜๋กœ์จ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— this๋Š” '์ „์—ญ ๊ฐ์ฒด'๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.


๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์‹œ์— this ๋Š”,

"๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ฃผ์ฒด(๋ฉ”์„œ๋“œ๋ช… ์•ž)"๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœ ํ–ˆ์„ ๋•Œ์˜ this ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ์ฃผ์ฒด, ์ฆ‰ ๋ฉ”์„œ๋“œ๋ฅผ ๋ˆ„๊ฐ€ ํ˜ธ์ถœํ–ˆ๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค. ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

a.b()๋ฅผ ํ˜ธ์ถœํ•ด์„œ b ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. { b: function() { console.log(this) }} ์™€ ๋˜‘๊ฐ™์ด ์ƒ๊ธด ๊ฒฐ๊ณผ ๊ฐ’์ด๋‹ค. ์ด ๊ฒฐ๊ณผ ๊ฐ’์ด ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ๋ง ๊ทธ๋Œ€๋กœ a.b()๋ฅผ ํ˜ธ์ถœํ•ด์„œ console.log(this) ๋ฅผ ์ถœ๋ ฅํ–ˆ์„ ๋•Œ์˜ this๋Š” a ๋ผ๋Š” ๋œป์ด๋‹ค. ์•„๋ž˜์˜ ์ถœ๋ ฅ์ธ { b: function() { console.log(this) }} ๋Š” ๊ณง a ๊ฐ’์˜ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์˜ˆ์‹œ์˜ a.b() ์ฒ˜๋Ÿผ . ์ด ์žˆ๋‹ค๋ฉด ์•ž์˜ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ์จ . ๋’ค์— ์žˆ๋Š” ๊ฒƒ์ด ๋ฉ”์„œ๋“œ๋กœ์จ ํ˜ธ์ถœํ–ˆ๋‹ค๋Š” ๋œป์ด ๋œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, a.b() ๋Š” b ํ•จ์ˆ˜๋ฅผ a ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ์จ ํ˜ธ์ถœํ•œ ๊ฒƒ์ด๋‹ค.

๐Ÿ“ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค(๊ฐ์ฒด)์™€ ๊ด€๋ จ๋œ ๋™์ž‘์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธ์Šคํ„ด์Šค๋Š” ์–ด๋–ค ํด๋ž˜์Šค์— ์†ํ•˜๋Š” '๊ฐ์ฒด'๋ผ๋Š” ๋œป์ด๊ธฐ์—, ์•„์˜ˆ Javascript ์—์„œ๋Š” ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ๊ฐ์ฒด์ด๊ธฐ๋งŒ ํ•˜๋ฉด ์–ด๋–ค ๊ฐ์ฒด์™€ ๊ด€๋ จ๋œ ๋™์ž‘์„ ๋œปํ•˜๋Š” ๋ง๋กœ ๋ฒ”์œ„๋ฅผ ํ™•์žฅ์‹œ์ผฐ๋‹ค. ์ฆ‰, ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€ ์—ฌ๋ถ€์™€๋Š” ์ƒ๊ด€ ์—†์ด ๊ฐ์ฒด์™€ ๊ด€๋ จ๋œ ๋™์ž‘์ด๊ธฐ๋งŒ ํ•˜๋ฉด '๋ฉ”์„œ๋“œ'๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ์ฒด a์˜ b ๊ฐ’์œผ๋กœ ํ• ๋‹นํ•œ function()์€ ์›๋ž˜๋Š” ํ•จ์ˆ˜์ด์ง€๋งŒ ๊ฐ์ฒด์™€ ๊ด€๋ จ๋œ ๋™์ž‘์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฉ”์„œ๋“œ๋กœ์„œ ๊ธฐ๋Šฅํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋‹ค๋ฅธ ์˜ˆ์‹œ๋„ ์‚ดํŽด๋ณด์ž.

์ด๋ฒˆ์—๋Š” a.b.c()๋ฅผ ํ˜ธ์ถœํ–ˆ๋‹ค. ์ด๋•Œ c ๋ผ๋Š” ํ•จ์ˆ˜ ์•ˆ์—์„œ this๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด this ๋Š” a.b ๊ฐ€ ๋œ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, c: f() ๋Š” { c: function() { console.log(this) } } ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, c ํ•จ์ˆ˜์— a.b ๋ผ๋Š” ๊ฐ์ฒด์™€ ๊ด€๋ จ๋œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋ผ๋Š” ๋ช…๋ น์„ ํ•œ ๊ฒƒ์ด๋‹ค.

ex) obj.b() ์˜ ๊ฒฝ์šฐ, this๋Š” obj ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
ex) obj['func']() ์˜ ๊ฒฝ์šฐ, this๋Š” obj ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
ex) person.info.getName() ์˜ ๊ฒฝ์šฐ, this ๋Š” person.info ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
ex) person.info['getName']() ์˜ ๊ฒฝ์šฐ, this ๋Š” person.info ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
ex) person['info']['getName']() ์˜ ๊ฒฝ์šฐ, this ๋Š” person['info'] ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

๋ฉ”์„œ๋“œ ํ•จ์ˆ˜ ๋‚ด์—์„œ์˜ ์šฐํšŒ๋ฒ•?

์ด์ „์— ์‚ดํŽด๋ณด์•˜๋˜ ์ฝ”๋“œ ์˜ˆ์‹œ์—์„œ,

๋ฉ”์„œ๋“œ ์•ˆ์— ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ  ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ๊ทธ ๋‚ด๋ถ€์˜ this ์—ญ์‹œ '์ „์—ญ ๊ฐ์ฒด'๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์€ ์—ฌ๋Ÿฌ๋ชจ๋กœ ์ด์ƒํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์—ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์šฐ๋ฆฌ๋Š” '์šฐํšŒ๋ฒ•'์ด๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. (arrow function์€ ์กฐ๊ธˆ ๋’ค์— ์„ค๋ช…ํ•  ๊ฒƒ์ด๋‹ˆ ๊ฑฑ์ •ํ•˜์ง€ ๋ง์ž!) ์•„๋ž˜์˜ ์˜ˆ์‹œ๋ฅผ ํ•จ๊ป˜ ๋ณด๋ฉด์„œ ์ด ์šฐํšŒ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

let a = 10;
let obj = {
	a: 20,
	b: function(){
		console.log(this.a); // 20 ์ถœ๋ ฅ
		
		function c() {
			console.log(this.a);
		}
		c(); // 10 ์ถœ๋ ฅ
	}
}

obj.b();

์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด obj.b()๊ฐ€ ๋ฉ”์„œ๋“œ๋กœ์จ ํ˜ธ์ถœ์ด ๋๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ, b์—์„œ์˜ this ๋Š” ๋‹น์—ฐํžˆ obj๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , this.a๋Š” obj์—์„œ ๊ฐ€๋ฆฌํ‚จ a์˜ ๊ฐ’, 20์ด ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค. ์•„๋ž˜์˜ ๋‚ด๋ถ€ ํ•จ์ˆ˜์ธ c ํ•จ์ˆ˜๋Š” ๋™์ผํ•˜๊ฒŒ this.a๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๋‚ด๋ถ€์—์„œ c๋ฅผ ํ•จ์ˆ˜๋กœ์จ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ this๋Š” '์ „์—ญ ๊ฐ์ฒด'๊ฐ€ ๋˜๋ฉฐ, ์ „์—ญ์—์„œ ์„ ์–ธํ•œ a ๋ณ€์ˆ˜์˜ ๊ฐ’ 10์ด ์ถœ๋ ฅ ๋  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ obj์˜ ํ”„๋กœํผํ‹ฐ a์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ผ๊ณ  ํ–ˆ๋”๋‹ˆ '์ „์—ญ ๋ณ€์ˆ˜' a์˜ ๊ฐ’(window.a)์„ ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์•„๋ฌดํŠผ c ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ ์ž ํ•˜๋Š” this.a ์˜ this ๊ฐ€ '์ „์—ญ ๊ฐ์ฒด'(window)๊ฐ€ ์•„๋‹ˆ๋ผ, obj ์—ฌ์•ผ ํ•œ๋‹ค๋ฉด, ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š” ๊ฑธ๊นŒ?

์•„์‰ฝ๊ฒŒ๋„ ํ˜„์žฌ๊นŒ์ง€๋Š” call, apply, ๊ฐ™์€ ๋ช…์‹œ์ ์ธ this ๋ฐ”์ธ๋”ฉ ๋ช…๋ น์„ ์“ฐ์ง€ ์•Š๊ณ ์„œ๋Š” this ์ž์ฒด๋ฅผ ์ง์ ‘ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ฎ์–ด ์”Œ์šธ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ c ํ•จ์ˆ˜์—์„œ this๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” '์ „์—ญ ๊ฐ์ฒด'๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค๋Š” ๋œป์ด ๋œ๋‹ค.

์šฐํšŒ๋ฒ•

let a = 10;
let obj = {
	a: 20,
	b: function(){
		let self = this;
		console.log(this.a); // 20 ์ถœ๋ ฅ
		
		function c() {
			console.log(self.a);
		}
		c(); // 20 ์ถœ๋ ฅ
	}
}

obj.b();

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, ์šฐ๋ฆฌ๋Š” ์•ž์—์„œ ๋ฐฐ์šด ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ์ด์šฉํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ์ƒ์œ„์—์„œ self ๋ผ๊ณ  ํ•˜๋Š” ๋ณ€์ˆ˜์— this ๋ฅผ ๋‹ด๊ณ , c ํ•จ์ˆ˜ ๋‚ด๋ถ€์— this ๋Œ€์‹  a์— ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด, ๋‚ด๋ถ€ ํ•จ์ˆ˜ c๋Š” ์ž์‹ ์˜ LexicalEnvironment ์—์„œ this ๋Œ€์‹  self ๋ฅผ ์ฐพ๊ณ (์ƒ์œ„์—์„œ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ ์—๊ฒ ์—†์„ ๊ฒƒ์ด๋‹ค.) ๋‹ค์‹œ outerEnvironmentReference ๋ฅผ ํƒ€๊ณ  ์™ธ๋ถ€(์ƒ์œ„)์˜ b ํ•จ์ˆ˜์˜ LexicalEnvirionment ์—์„œ self๋ฅผ ์ฐพ๋Š”๋‹ค. self ์—๋Š” ์•ž์„œ ๋“ค์–ด์˜จ this ๊ฐ€ ๋‹ด๊ฒจ์žˆ์„ ๊ฒƒ์ด๊ณ , ์ด๋•Œ์˜ this ๋Š” obj.b()๋ฅผ ๋ฉ”์„œ๋“œ๋กœ์จ ํ˜ธ์ถœํ•  ๋•Œ์˜ this ์ด๊ธฐ์— obj๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด, ํ•จ์ˆ˜๋กœ์จ ํ˜ธ์ถœํ•œ c ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this ์—ญ์‹œ, ๋ฉ”์„œ๋“œ๋กœ์จ ํ˜ธ์ถœํ•  ๋•Œ์™€ ๋™์ผํ•œ this ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ES6 arrrow function

let a = 10;
let obj = {
	a: 20,
	b: function(){
		console.log(this.a); // 20 ์ถœ๋ ฅ
		
		const c = () => {
			console.log(this.a);
		}
		c(); // 20 ์ถœ๋ ฅ
	}
}

obj.b();

ES6 ์—์„œ๋Š” this ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š๋Š” arrrow function ์ด ๋“ฑ์žฅํ–ˆ๋Š”๋ฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ž์—์„œ ํ–ˆ๋˜ ๋ฐฉ์‹์ฒ˜๋Ÿผ ์šฐํšŒ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์Šค์ฝ”ํ”„ ์ฒด์ด๋‹ ์ƒ์˜ this์— ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

b: function(){
	console.log(this.a); // 20 ์ถœ๋ ฅ
		
	const c = () => {
		console.log(this.a);
	}
	c(); // 20 ์ถœ๋ ฅ
}

c ๋ผ๋Š” arrow function ์—์„œ ๊ฐ€๋ฆฌํ‚ค๋Š” this๋Š” ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์œ„์— ์žˆ๋Š” this๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ , 20์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค.

๐Ÿ“ ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, ES5 ์—์„œ๋„ call ์ด๋‚˜ apply ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.


callback ํ˜ธ์ถœ์‹œ this ๋Š”,

callback ํ˜ธ์ถœ์‹œ this ๋Š”,

๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” 'ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ์—' ์ฒ˜๋Ÿผ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์™€ ๋™์ผํ•˜๊ฒŒ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€๋งŒ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์–ด๋–ค ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€์— ๋”ฐ๋ผ์„œ (.call, .bind(), apply() ๋“ฑ) this๋Š” ์–ผ๋งˆ๋“ ์ง€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, .bind() ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ this๋ฅผ ๋ช…์‹œํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋ช…์‹œ์ ์œผ๋กœ this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

  1. .call
  2. .bind()
  3. apply()
function a(x, y, z) {
	console.log(this, x, y, z);
};

let b = {
	bb: 'bbb'
};

a.call(b, 1, 2, 3);
a.apply(b, [1, 2, 3]);

let c = a.bind(b);
c(1, 2, 3);
let d = a.bind(b, 1, 2);
d(3);

์œ„์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. a.call(b, 1,2,3)์ธ ๊ฒฝ์šฐ, console.log(this, 1,2,3) ๋ฅผ ์ถœ๋ ฅํ–ˆ์„ ๋•Œ { bb: 'bbb' } 1 2 3 ์ด ๋‚˜์™”๋‹ค. ์ฆ‰ this ๋Š” ๋ณ€์ˆ˜ b๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. a.apply(b, [1,2,3]) ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ๋ฐฐ์—ด๋กœ ๋„˜๊ธด ๊ฐ๊ฐ์˜ ์š”์†Œ๋“ค์ด ๋งค๊ฐœ๋ณ€์ˆ˜ x, y, z๋กœ ๋„˜์–ด๊ฐ€๊ณ , this๋Š” ๋ณ€์ˆ˜ b๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค. c ์˜ ๊ฒฝ์šฐ, a์— b๋ฅผ bind ํ•˜๊ณ  ๊ทธ ํ›„์— c๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•ด์ฃผ๋Š” ํ˜•ํƒœ๋‹ค. ๊ทธ ๋ง์ธ์ฆ‰์Šจ, ๋ณ€์ˆ˜ c์— ๋‹ด๋Š” a.bind(b) ๊นŒ์ง€๋Š” ์•„์ง ํ˜ธ์ถœ์ด ๋˜์ง€ ์•Š๊ณ  this๋ฅผ ๊ทธ์ € ๋“ค๊ณ  ์žˆ๋Š” ์ƒํƒœ๋ผ๊ณ  ์œ ์ถ”ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  c๋ฅผ ํ˜ธ์ถœํ•ด์คŒ์œผ๋กœ์„œ ์ฒ˜์Œ์— ๋„˜๊ฒจ์ค€ this๋ฅผ ๋“ค๊ณ  ์žˆ๋˜ ์ƒํƒœ์—์„œ ๋‚˜๋จธ์ง€ ์ธ์ž๋“ค์ด ๋“ค์–ด๊ฐ”๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. d ๋ฅผ ๋ณด๋ฉด ์กฐ๊ธˆ ๋” ํ™•์‹คํ•ด์ง„๋‹ค. ์ฒ˜์Œ์—๋Š” this์ธ b ์™€ ์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊นŒ์ง€ ๋„˜๊ฒจ์ฃผ์—ˆ์ง€๋งŒ ์•„์ง ์‹คํ–‰์€ ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋ณ„๊ฐœ์˜ bind๋œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋†“์€ ์ƒํƒœ์—์„œ d๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๋‚˜๋จธ์ง€ ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋จผ์ € this์™€ 1, 2 ๋Š” ๋“ค์–ด๊ฐ€์žˆ๋Š” ์ƒํƒœ์—์„œ 3์„ ๋‹ค์‹œ ๋„˜๊น€์œผ๋กœ์จ ์‹ค์ œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒŒ ๋œ๋‹ค.

bind

func.bind(thisArg[, arg1[, arg2[, ...]]])

apply

func.bind(thisArg[, arg1[, arg2[, ...]]])

call

func.call(thisArg[, arg1[, arg2[, ...]]])

MDN ๊ณต์‹๋ฌธ์„œ ์ถœ์ฒ˜ : Function.prototype.bind()
MDN ๊ณต์‹๋ฌธ์„œ ์ถœ์ฒ˜ : Function.prototype.apply()
MDN ๊ณต์‹๋ฌธ์„œ ์ถœ์ฒ˜ : Function.prototype.call()

์ฝœ๋ฐฑํ•จ์ˆ˜ ์ •๋ฆฌ

ex) this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ

let callback = function() {
  console.dir(this); // window ์ „์—ญ๊ฐ์ฒด
};

let obj = {
  a: 1,
  b: function(cb) {
    cb(); // ํ•จ์ˆ˜๋กœ์จ ํ˜ธ์ถœ
  }
}

obj.b(callback);

ex) this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ ํ–ˆ์„ ๋•Œ

let callback = function() {
  console.dir(this); // obj ์ถœ๋ ฅ
};

let obj = {
  a: 1,
  b: function(cb) {
    cb.call(this); // obj๋ฅผ this๋กœ ๋„˜๊น€
  }
}

obj.b(callback);
  • ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ž์ฒด์—์„œ ๋ญ˜ ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ•ด๋‹น ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋„˜๊ฒจ ๋ฐ›๋Š” ๋Œ€์ƒ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ฒจ๋ฐ›์€ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์–ด๋–ค ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ์„œ this ๋Š” ๋‹ฌ๋ผ์ง„๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ๋กœ์ง์—์„œ callback ํ•จ์ˆ˜๋ฅผ ๋„˜๊ฒจ๋ฐ›์€ ๋Œ€์ƒ์ด cb๋ฅผ ๊ทธ๋ƒฅ ํ•จ์ˆ˜๋กœ์จ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ๋Š” ๋‹น์—ฐํžˆ ์ „์—ญ๊ฐ์ฒด๊ฐ€ this๋กœ ์ถœ๋ ฅ๋˜์ง€๋งŒ, callback ํ•จ์ˆ˜๋ฅผ ๋„˜๊ฒจ๋ฐ›์€ ๋Œ€์ƒ์ด cb.call๋กœ this๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค๋ฉด ๊ทธ๋•Œ๋Š” obj๊ฐ€ this๊ฐ€ ๋œ๋‹ค. ๊ทธ ๋ง์ธ ์ฆ‰์Šจ, ์œ„์˜ ์ฝ”๋“œ์—์„œ์˜ callback ์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ this๋Š” obj ๋กœ ํ•ด์•ผํ•œ๋‹ค๋Š” ๋ช…๋ น์„ ๋‚ด๋ฆฐ๋‹ค๋ฉด obj๊ฐ€ this๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด๊ณ , ์ด๋ ‡๊ฒŒ ๋ช…์‹œ์ ์œผ๋กœ this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ „์—ญ๊ฐ์ฒด๊ฐ€ this๋กœ ์ถœ๋ ฅ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ์˜ this๋Š” ์ง€์ •ํ•˜๋Š” ๋ฐ”์— ๋”ฐ๋ผ์„œ ๊ทธ๋•Œ๊ทธ๋•Œ ๋‹ฌ๋ผ์ง„๋‹ค.

ex) this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ

let callback = function() {
  console.dir(this);
};

let obj = {
  a: 1,
}

setTimeout(callback, 100)

ex) this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ ํ–ˆ์„ ๋•Œ

let callback = function() {
  console.dir(this);
};

let obj = {
  a: 1,
}

setTimeout(callback.bind(obj), 100)
  • this๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜์˜ this ์™€ ๊ฐ™๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜, ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๊ฐ€ ์ฝœ๋ฐฑ์˜ this๋ฅผ ์ง€์ •ํ•ด๋‘” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์ง€์ •ํ•ด์ค€ this๋ฅผ ๋”ฐ๋ฅด๊ฒŒ ๋œ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ this๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์„œ ์ฝœ๋ฐฑ์„ ๋„˜๊ธฐ๋ฉด ๊ทธ์— ๋”ฐ๋ฅธ๋‹ค. (ex. function(){}.bind(this))

์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ this ๋Š”,

(์ถ”๊ฐ€ ์ž‘์„ฑ ์˜ˆ์ •)


์ƒ์„ฑ์žํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ,

(์ถ”๊ฐ€ ์ž‘์„ฑ ์˜ˆ์ •)


โœฆ ์ถœ์ฒ˜


๐Ÿšจ ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ์ •์žฌ๋‚จ์˜ โŒœ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธโŒŸ ๊ฐ•์˜์™€ ๋™๋ช…์˜ ์ฑ…์„ ๋ฒ ์ด์Šค๋กœ ํ•œ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค.
๐Ÿ”– ํ‘œ์™€ ๊ทธ๋ฆผ์€ ์ „๋ถ€ ์ œ๊ฐ€ ํ•œ๋•€ํ•œ๋•€ ๊ทธ๋ฆฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.. ๋ถˆํŽŒ ์ž์ œ ๐Ÿฅธ

profile
์ผ๋‹จ ๊ณต๋ถ€๊ฐ€ '์ ์„ฑ'์— ๋งž๋Š” ๊ฐœ๋ฐœ์ž. ๊ทผ์„ฑ์žˆ์Šต๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€