์ง๊ธ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ง์ง๋ง ์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ฃ๊ตฌ์กฐ์ ๋ํด ๋ฐฐ์ฐ๊ณ ์์ง๋ง, ๋ด๊ฐ ์ดํด๊ฐ ์๋๋ ๋ถ๋ถ์ด ๋ง์์ ๊ฐ์ฅ ์ฃผ์ถคํ๋ ๋ถ๋ถ์ด Prototype
์ด ๋ค๊ฐ์์ ๋ ๋ถํฐ ์ธ ๊ฒ ๊ฐ๋ค.
๊ทธ๋์ ์๊ฐ์ด ์์ ๋ ๊ผญ Prototype
์ ์กฐ๊ธ์ด๋ผ๋ ์ดํดํ๋๋ก ํด๋ณด์๋ผ๋ ๋ง์ธ๋๋ก ์ค๋ ์ ๋ฆฌ๋ฅผ ํ๋ค.
ํ์ฌ ์ฐธ์ฌํ๋ ๊ฐ์์์๋ ๋ค๋ฃจ์์ง๋ง ๊ฐ์ ์๋ฃ๋ฅผ ๋ฐํ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ง ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํ๋๋ฐ ์๋์ ์์ฑํ๋ค.
- ์ํ์ฝ๋ฉ Prototype/Prototype Chain
- Modern Javascript Deep Dive 19์ฅ. ํ๋กํ ํ์
- ์ธํ๋ฐ "์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธ"
- NomadCoder ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์์
๊ทธ๋ฆฌ๊ณ ๋๋ฌด ๊น๊ฒ ๋ค๋ฃฌ๋ค๋ฉด ๋๋ ์๊ธฐ ๋๋ฌธ์ ํ์ฌ๋ก์ ์ดํดํ ์ ์๋ "Prototype"์ ๊ฐ๋ ๊ณผ "Prototype Chain"์ ๋ํด์ ์ค์ค๋ก ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
์์ด์ธ "Prototype"์ ํด์ํ๋ฉด ์ด๋ค ๋ง์ธ๊ฐ?
"์ํ"์ด๋ผ๋ ๋ป์ด๋ค.
์ฌ๊ธฐ์ ์ํ์ "๊ฐ์ฒด์ ์ํ"์ ์๋ฏธํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด๋ฃจ๊ณ ์๋ ๊ฒ์ ์์ ํ์
์ธ number
, string
๋ฑ์ ์ ์ธํ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ด ๊ฐ์ฒด์ด๋ค.
์ฌ๊ธฐ์ ๊ฐ์ฒด๋ ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ฏ์ด ์๋์ฒ๋ผ key
์ value
์ ์์ผ๋ก ์ด๋ฃจ์ด์ง Property
๋ฅผ ๊ฐ์ง ์ ์๋ค.
<script>
let obj = {
name : "hyunwoo", // property
age : "30" // property
}
</script>
์์ ๊ฐ์ฒด obj
๋ฅผ console.dir()
์ ํตํด ์ถ๋ ฅํด๋ณด๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
์ฐ๋ฆฌ๊ฐ ์ค์ ํ๋ ํ๋กํผํฐ์ธ name
๊ณผ age
๊ฐ ๋ณด์ด๊ณ , ์๋์ ์ฐ๋ฆฌ๊ฐ ์ค์ ํ์ง๋ ์์ ํ๋กํผํฐ๊ฐ ์ฌ๋ฌ ๊ฐ๋ ํจ๊ป ์ถ๋ ฅ์ด ๋๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ Prototype
์ด๋ผ๋ ๋จ์ด๋ฅผ ์ฒ์ ๋ณผ ์ ์๊ฒ ๋ ๊ฒ์ด๋ค.
๋ณธ๋ก ์ผ๋ก ๋ค์ด๊ฐ์๋ฉด Prototype
์ด๋ผ๋ ํ๋กํผํฐ ๋ด์ ์์ฑ๋ค์ "์์ฑ์"๋ฅผ ํตํด์ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง ๋ ๊ทธ ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋๋ค.
์๋๋ฅผ ๋ณด๋๋ก ํ์.
์ฐ๋ฆฌ๋ ๊ฐ์ฒด์ธ ๋ณ์ obj
๋ฅผ ์์ฑํ๋๋ฐ "๊ฐ์ฒด ๋ฆฌํฐ๋ด" ๋ฐฉ์์ผ๋ก ์ ์ธ์ ํ๋ค. ํ์ง๋ง "๊ฐ์ฒด ๋ฆฌํฐ๋ด" ๋ฐฉ์์ผ๋ก ์ ์ธํ ๊ฒ์ ์ฌ์ค "์์ฑ์ ํจ์"๋ฅผ ํตํด ์์ฑ๋ ๊ฒ์ด๋ผ ๋ณผ ์ ์๋ค.
๊ทธ๋์ ์์ ๋๊ฐ์ด console.dir()
๋ก ์ถ๋ ฅํ์ ๋ ์์ฑ์ ํจ์๋ฅผ ๋ปํ๋ Prototpye
์ ํ๋กํผํฐ์ธ constructor
๋ ํจ์์ธ function Object(name, age)
๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
์ฌ๊ธฐ์ Prototype
์ ์ดํดํ๋ ค๋ฉด ์์ฑ์ ํจ์๋ฅผ ์ดํดํด์ผ ํ ๊ฒ ๊ฐ๋ค.
์์ฑ์๋ "ํจ์"์ธ๋ฐ ์์ new
ํค์๋๊ฐ ๋ถ์ด์ ์๋ก์ด ๊ฐ์ฒด์ธ instance
๋ฅผ ์์ฑํ ํ ๋ฐํํ๋ "์์ฑ์ ํจ์"๊ฐ ๋๋ค.
์์์ new Object()
์ฒ๋ผ ๋ง์ด๋ค.
<script>
// ์์ฑ์ ํจ์ Sub() ์ ์ธ
function Sub(name, age){
this.name = name;
this.age = age;
}
// ์๋ก์ด ๊ฐ์ฒด instance ์์ฑ
var obj = new Sub("hyunwoo", 30);
</script>
๊ทธ๋ฐ๋ฐ ์ฐ๋ฆฌ๋ ๋๊ฐ๋ด๋ ์์ฑ์ ํจ์๋ฅผ ํตํ ๊ฐ์ฒด์ ์์ฑ์ ๋งค์ฐ ๋ถํธํด๋ณด์ธ๋ค.
๊ทธ๋ฅ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ํตํด var obj = { name:"hyunwoo", age:30}
์ฒ๋ผ ์ ์ผ๋ฉด ํจ์ฌ ๊ฐ๋จํ๊ฒ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋๋ฐ ๋ง์ด๋ค.
์ด ๋ถ๋ถ์์๋ "๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)"๊ฐ ๋๋ต์ด ๋ ์ ์๊ฒ ๋ค.
๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ๊ฒ์์์ ์บ๋ฆญํฐ๋ฅผ ๋ง๋ ๋ค๋ฉด ์ด๋ป๊ฒ ๋ง๋ค ์ ์์๊น?
<script>
const user1 = {
name: "John",
hp : 85,
skill : "fire ball",
xp : 0,
}
const user2 = {
name: "Jane",
hp : 120,
skill : "strike",
xp : 0,
}
const user3 = {
name: "Mike",
hp : 120,
skill : "blink",
xp : 0,
}
</script>
์์ฒ๋ผ ์ ์ ํ๋ ํ๋์ name
, hp
, mp
, skill
๋ฑ์ ํ๋กํผํฐ๋ฅผ ์์ฑํด์ค์ผํ๋ค๋ ๋ฒ๊ฑฐ๋ก์์ด ์๋ค.
์ผ์ผ์ด ์์ฑํด์ผํ๋ค๋ฉด ๊ทธ๋งํผ ์๊ฐ๊ณผ ๊ฐ์ด ๋ฆฌ์์ค์ ์๋ชจ๋ ํฌ๊ณ , ์ค์์ ๊ฐ๋ฅ์ฑ๋ ์ปค์ง๋ค.
๊ทธ๋์ ์์ ์์ ๋ฅผ ๋ณด๋ฉด ๋ฐ์ดํฐ์ xp : 0
๋ผ๋ key
์ value
๊ฐ ๋์ผํ๊ฒ ๋ฐ๋ณต๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๊ฒ์ ํ๋์ ์ค๊ณ๋๋ฅผ ๋๊ณ ๋ฐ์ดํฐ ๊ฐ๋ง ๋ฐ๋ก ์์ฑ์ ํ๋ค๋ฉด ์ด๋จ๊น?
์๋์ ์์ ๋ ์์ง์ ์ ๋ฆฌ๋ฅผ ํ์ง ์์ ํด๋์ค(Class)๋ฅผ ์ฌ์ฉํ๋ค.
๊ฐ๋จํ ๋งํ์๋ฉด ํด๋์ค๋ ํ๋์ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ "์ค๊ณ๋"์ด๋ฉฐ "ํ
ํ๋ฆฟ" ๊ฐ์ ๊ฐ๋
์ด๋ค.
๋ค์ ๊ฒ์๊ธ๋ก ํด๋์ค๋ฅผ ์ดํดํ๊ณ ์ ๋ฆฌํด๋ณด๋๋ก ํ๊ฒ ๋ค. ๐
<script>
// ์ ์ ๋ฅผ ์์ฑํ ํ
ํ๋ฆฟ ํด๋์ค ์์ฑ
class User {
constructor(name, hp, skill){
this.name = name;
this.hp = hp;
this.skill = skill;
this.xp = 0;
}
}
const user1 = new User("John", 85, "fire ball");
const user2 = new User("Jane", 120, "strike");
const user3 = new User("Mike", 120, "blink");
</script>
์์ฒ๋ผ ์์ฑ ์ ์ด์ ์์ ์ ๊ฐ์ ๊ฐ์ด ์ถ๋ ฅ์ด ๋๋ค. ํจ์ฌ ๊ฐ๋ ์ฑ์ด ์ฌ์์ง๊ณ ๊ฐ์ ๋ฃ๊ธฐ์๋ ํธ๋ฆฌํด์ง๊ณ ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๊ฒ๊ณผ ๋๊ฐ์ด Prototype
์ ํตํด์ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์๋ค.
<script>
function User(name, hp, skill){
this.name = name;
this.hp = hp;
this.skill = skill;
}
// prototype์ ํตํ xp ํ๋กํผํฐ ์์ฑ
User.prototype.xp = 0;
const user1 = new User("John", 85, "fire ball");
</script>
์์ฒ๋ผ ์์ฑ์ํจ์์ Prototype
๋ฅผ ํตํด ํ๋กํผํฐ xp
๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ user1
์ console.log()
๋ก ํ์ธ์ ํ์ ๋ ์๋์ฒ๋ผ ์ถ๋ ฅ์ด ๋๋ค.
๊ทผ๋ฐ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ํ๋กํผํฐ xp
๋ ๋ณด์ด์ง ์๋๋ฐ ์ด๋์ ์๋ ๊ฒ์ผ๊น?
xp
๋ ๋ฐ๋ก Prototype
์์ ์กด์ฌํ๋ค.
๊ทธ๋์ ๋ง์ฝ xp
์ ๊ฐ์ ํ์ํ ๋ ๊ฐ์ฒด ๋ด์ ์ถ๋ ฅ๋๋ ํ๋กํผํฐ๋ ์๋์ง๋ง ๋ฌธ์ ์์ด ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
Prototype
์ ์ฝ๊ฒ ์๊ฐํ์๋ฉด ์กฐ์์ผ๋ก๋ถํฐ ๋ฌผ๋ ค๋ฐ์ "์ ์ ์"๋ผ๊ณ ํ ์ ์๋ค.
์กฐ์ ์ค ์ด๋์ ์๊ฐ ์์ ๋ ๋ด๊ฐ ์ด๋์ ๋ํ ์ฌ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ๋ชจ๋ฅด์ง๋ง ์ด๋์ข ๋ชฉ์์ ๋๋ ๋ชจ๋ฅด๊ฒ ๋ฅ๋ ฅ์ ๋ฐํํ ์ ์๋ ๊ทธ๋ฐ ๊ฐ๋ ์ผ๋ก ์ดํดํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค. ๐
์ฌ๊ธฐ์ ๋ฌผ๋ ค๋ฐ๋ ๊ฐ๋
์ Prototype Chain
์ด๋ผ๊ณ ํ ์ ์์ ๊ฒ ๊ฐ๋ค!
๋๋ ๊ฐ์๋ฅผ ๋ค์ผ๋ฉด์ "์ฒด์ด๋"์ด๋ผ๋ ๋ง์ ๋ง์ด ๋ค์๋ค.
์ฒด์ธ์ ๋ด๊ฐ ์๊ฐํ๋ ๐ ์ฌ์ฌ์ ๋งํ๋ ๊ฒ์ด๋ ์ฐ๊ฒฐ๋๋ค๋ ๋ป์ผ๋ก ์ดํดํ์๋๋ฐ ์ฒด์ด๋ ๊ฐ๋
์ด ์ ํํ ์ผ์นํ๋ค.
"์ฐ์์ ์ผ๋ก ์ด์ด์ง๋ ๋์ ๋ฐฉ์"์ด๋ผ๊ณ ์๊ฐ์ ํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
์ค์ฉ์ ์ธ ์์ ๋ ์๋์ง๋ง ๊ฐ๋ ์ ์ดํด๋ฅผ ์ํด ์ํ์ฝ๋ฉ์์ ๊ฐ์ ธ์จ ์์ ๋ฅผ ์ดํด๋ณด๋๋ก ํ์.
<script>
function Ultra(){};
Ultra.prototype.ultraProp = true; // ์ด ๋ถ๋ถ์ ์ฃผ๋ชฉํด์ผํ๋ค.
function Super(){};
Super.prototype = new Ultra();
function Sub(){};
Sub.prototype = new Super();
var o = new Sub();
console.log(o.ultraProp); // ์ด๋ค ๊ฐ์ด ๋์ฌ๊น?
</script>
console.log(o.ultraProp)
์ ์ถ๋ ฅํ๋ฉด ์ด๋ค ๊ฐ์ด ๋์ฌ๊น?
๋๋ ์ฒ์์ ๋ณ์ o
๋ ์์ฑ์ ํจ์ new Sub()
๋ฅผ ํตํด ์์ฑ๋ ์ธ์คํด์ค์ด๊ณ function Sub(){}
๋ฅผ ๋ณด์ํ๋ ์๋ฌด๋ฐ ํ๋กํผํฐ๋ฅผ ์์ฑํ์ง ์์์ผ๋๊น undefined
๊ฐ ๋์ค์ง ์์๊น? ๋ผ๊ณ ์๊ฐํ๋ค.
ํ์ง๋ง ๋์ค๋ ๊ฐ์ true
๊ฐ ๋์จ๋ค.
์ฝ๋๋ฅผ ํ๋์ฉ ์ค๋ช ์ ํ์๋ฉด ์ด๋ ๋ค.
<script>
function Ultra(){}; // ์์ฑ์ ํจ์ Ultra() ์ ์ธ
Ultra.prototype.ultraProp = true; // Ultra์ Prototype์ ํตํด ํ๋กํผํฐ ultraProp ์ ํค์ ๊ฐ ์์ฑ
function Super(){}; // ์์ฑ์ ํจ์ Super() ์ ์ธ
Super.prototype = new Ultra(); // Super.prototype์ ์์ฑ์ ํจ์ Ultra()์ ์ธ์คํด์ค๋ก ์์ฑ
function Sub(){}; // ์์ฑ์ ํจ์ Sub() ์ ์ธ
Sub.prototype = new Super(); // Sub.prototype์ ์์ฑ์ ํจ์ Super()์ ์ธ์คํด์ค๋ก ์์ฑ
var o = new Sub(); // ๋ณ์ o๋ฅผ ์์ฑ์ ํจ์ Sub()์ ์ธ์คํด์ค๋ก ์์ฑ
console.log(o.ultraProp); // true
</script>
๋ณด๋ฉด "์ด๊ฒ ๋ฌด์จ ์ฝ๋์ง?"๋ผ๋ ์๊ฐ์ ๊ฐ์ง ์ ์๋ค. ์์งํ ๋๋ ์ฒ์ ๋ดค์ ๋ ์ด๊ฑธ ์ด๋ป๊ฒ ํด์ํด์ผํ๋ ๊ฑด์ง ๋ชฐ๋๋ค.
๊ทผ๋ฐ ๋ณด๋ฉด ๊ณตํต์ ์ธ ๋ถ๋ถ์ด ๋ง๋ค. ๊ฐ ์ธ์คํด์ค์ธ prototype
์ ๊ฐ๊ฐ์ ์์ฑ์ ํจ์๋ก ์์ฐจ์ ์ผ๋ก ์์ฑ๋๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ฌ๊ธฐ์ Prototype
์ "์ ์ ์"๋ผ๊ณ ํ๋ค.
๋ณด์ด์ง๋ ์์ง๋ง ํ์ฌ ์์ฑ์ ํจ์ Ultra
๊ฐ ๊ฐ์ง protoype.ultraProp
๋ ์๋์ ์์ฑ์ ํจ์์ ์ํฅ์ ์ฃผ๊ณ ์๋ค.
๊ฐ๊ฐ ์์ฑ๋ ์ธ์คํด์ค๋ค์ console.log()
๋ฅผ ํตํด ์ดํด๋ณด๋๋ก ํ์.
์ ์ฐจ ๋ด๋ ค๊ฐ๋ฉด์ Prototype
๊ฐ ๋์ด๋๋ฉด์ ultraProp
๊ฐ ์กด์ฌํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๊ฒ์ Prototype
์ ์์
๋๋ฌธ์ธ๋ฐ ๊ทธ๋ฆผ์ผ๋ก ์ฝ๊ฒ ํํํด๊ฒ ๋ค.
Ultra
์์ Prototype
์ ํตํด ์์ฑํ ultraProp = true
๋ ๋ด๊ฐ ์ค๋ช
ํ "์ ์ ์ํ"๊ฐ ๋์๋ค.
๊ทธ๋์ ์์ ๊ฐ์ฒด(์ธ์คํด์ค)์ธ Ultra
๋ก๋ถํฐ Super
๊ฐ ultraProp = true
๋ฅผ ๋ฌผ๋ ค๋ฐ๊ฒ ๋๊ณ
์๋์ ์ธ์คํด์ค ๋ํ ๋ชจ๋ ์์์ ๋ฐ๊ฒ ๋๋ค.
๊ทธ๋์ ๋น์ฌ์๋ ๋ชจ๋ฅด์ง๋ง ๊ฐ์ง๊ณ ์๋ ํ๋กํผํฐ์ ์ ๊ทผํ ์ ์๋ ๊ฒ์ด๋ค.
์ ๊ทผ์ ํตํด ๋์จ ๊ฒฐ๊ณผ๋ฅผ Prototype Chain
์ ์ํด ์ด๋ฃจ์ด์ก๋ค๋ผ๊ณ ํ ์ ์์ ๊ฒ ๊ฐ๋ค.
<script>
function Ultra(){};
Ultra.prototype.ultraProp = true; // ์ด ๋ถ๋ถ์ ์ฃผ๋ชฉํด์ผํ๋ค.
function Super(){};
Super.prototype = new Ultra();
function Sub(){};
Sub.prototype = new Super();
var o = new Sub();
console.log(o.ultraProp); // ์ด๋ค ๊ฐ์ด ๋์ฌ๊น?
</script>
ํ์ฌ ์ฝ๋๋ฅผ ๋ค์ ๋ณด์๋ฉด ultraProp
๋ฅผ ์์ฑํ ๊ณณ์ Ultra
์ด๋ค.
ํ์ง๋ง ๋ณ์ o
์์ ultraProp
์ ์ ๊ทผ์ ํ์ ๋ true
๊ฐ ๋ฐํ์ด ๋์๋ค.
๊ณผ์ ์ด ์ด๋ป๊ฒ ๋ ๊ฒ์ธ์ง ๋ณด๋๋ก ํ์.
์ด๋ฐ ์์ผ๋ก ์์ ์๊ฒ์ ์ฐพ๋ค๊ฐ ์ฐพ์ง ๋ชปํ๋ฉด ์์ ๊ฐ์ฒด๋ก ์ฌ๋ผ๊ฐ๋ฉด์ ์ฐพ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒ์ด Prototype Chain
์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ค์ํ ์ ์ ์์ ๊ฐ์ฒด๋ก ์์ฐจ์ ์ผ๋ก ์ฌ๋ผ๊ฐ๋ฉด์ ๊ฒ์์ ํ์ ๋ ๋จผ์ ๋์ค๋ ๊ฐ์ ์ถ๋ ฅํ๋ค๋ ๊ฒ์ด๋ค.
์ค๋์ ์ง์ง ๊ณต๋ถํ ๋๋์ด ๋ค์ด์ ๋ฟ๋ฏํ ๊ฒ ๊ฐ๋ค.
๋ด๊ฐ ๋ชฐ๋๋ ๋ถ๋ถ์ ๊นจ๋ซ๊ณ ์ด๊ฒ์ ๊ณต๋ถํด์ผ์ง๋ผ๊ณ ๊ณํ์ ํ๋๋ฐ ์ด์ฌํ ์ค๋น๋ฅผ ํ๋ฉด์ ์ ๋ฆฌ๋ฅผ ํ๊ณ ๋๋ ๋์ฑ ๊ทธ๋ฐ ๊ฒ ๊ฐ๋ค.
๋ฌผ๋ก ์์ ์๋ ์ ๋ณด๋ฅผ ์ฌ๋ฌ ๊ณณ์์ ์ฐธ๊ณ ๋ฅผ ํ๊ณ ๋์ ์ดํด๋ฅผ ๋ฐํ์ผ๋ก ์์ฑ์ด ๋์๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ๋ถ๋ถ๋ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
๊ทธ๋์ ๋ค๋ฅธ ๋ถ๋ค๊ป ํ์ธ์ ๋ฐ๊ณ ์์ ์ ํด๋ณผ ์์ ์ด๋ค.
์ค๋๋ง์ ๋์ ๊ณต๋ถํ ๊ธฐ๋ก์ ์ ๋๋ฐ ์ฌ๋ฏธ์์๋ค. ๋ค์์ ํด๋์ค๋ฅผ ์ ๋ฆฌ๋ฅผ ํ ๊ฑด๋ฐ ๊ธฐ๋๊ฐ ๋๋ค. ๐