๋ค๋ง ์ ์ฐจ์ ์ธ์ด๋ ๋ฒ์ญ์์ ์ค๋ฅ๊ฐ ๊ตณ์ด์ง ํํ๋ฒ์ด๋ผ๊ณ ํ๋ค.
Procedural Programming์ด๋ผ๋ ๋จ์ด์์prcedural
์ `procedure
๋ฅผ ์ ์ฐจ๋ก ๋ฒ์ญํ๊ธฐ ๋๋ฌธ์ธ๋ฐ,prcedure
๋ c์์ ํจ์๋ฅผ ์๋ฏธํ๋ฉฐ, ํจ์ ํธ์ถ์ ํตํ ์ถ์ํ์ ์ฌ์ฌ์ฉ์ฑ์ ์ป๊ธฐ ๋๋ฌธ์ procedural programming์ด ๋ ๊ฒ์ด๋ผ๊ณ ํ๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก ๋งํ์๋ฉด ๋ชจ๋ ์ธ์ด๋ ์ ์ฐจ์ ์ด๊ธฐ ๋๋ฌธ์ '์ ์ฐจ์ ํ๋ก๊ทธ๋๋ฐ'์ด๋ผ๋ ๋ง์ ์ข์ง ์์ ๊ตฌ๋ถ๋ฒ์ผ๋ก ๋ณด์ธ๋ค.
<์ฐธ๊ณ : https://namu.wiki/w/์ ์ฐจ์ %20ํ๋ก๊ทธ๋๋ฐ>
์ ์:
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(์์ด: Object-Oriented Programming, OOP)์ ์ปดํจํฐ ํ๋ก๊ทธ๋๋ฐ์ ํจ๋ฌ๋ค์ ์ค ํ๋์ด๋ค. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ๋ช ๋ น์ด์ ๋ชฉ๋ก์ผ๋ก ๋ณด๋ ์๊ฐ์์ ๋ฒ์ด๋ ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ๋ ๋จ์, ์ฆ "๊ฐ์ฒด"๋ค์ ๋ชจ์์ผ๋ก ํ์ ํ๊ณ ์ ํ๋ ๊ฒ์ด๋ค. ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
<์ถ์ฒ - https://ko.wikipedia.org/wiki/๊ฐ์ฒด_์งํฅ_ํ๋ก๊ทธ๋๋ฐ>
https://jeong-pro.tistory.com/95 ์ฌ๊ธฐ๋ ์ฐธ๊ณ ํ ๋ง ํ๋ค
์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ถ์ํ๋ฅผ ๊ฑฐ์ณ ์ง๋จ์ ์ํ๋ ์์ฑ/property
๊ณผ ํ์
๋ฅผ ๋ณ์
์ ๋ฉ์๋
๋ก ์ ์ํ ๊ฒ
์ฐธ๊ณ :
๊ฐ์ฒด ๋ด์๋ ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ ๋์ํ๋ ์์ฑ๊ณผ ๋ฉ์๋๊ฐ ์กด์ฌํ๋ค.
์๋ฅผ ๋ค์ด, ๋ชจ๋ ์๋์ฐจ๋ ๊ณตํต์ ์ธ ๊ธฐ๋ฅ๊ณผ ๊ณ ์ ์ ์์ฑ์ด ์๋ค. ๊ฐ์, ๊ฐ์, ์ฃผ์ ๋์ด ๊ธฐ๋ฅ๊ณผ ์์, ์ต๊ณ ์๋ ฅ, ํ์น์ธ์๊ณผ ๊ฐ์ ๊ณ ์ ์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ค.
- ํด๋์ค๋, ์ธ๋ถ ์ฌํญ์ด(์์ฑ/property)์ด ๋ค์ด๊ฐ์ง ์์ ์ฒญ์ฌ์ง์ผ๋ก ๋ณผ ์ ์๋ค. ์ธ๋ถ ์ฌํญ(์์ฑ/property)๋ง ์ ํด์ค๋ค๋ฉด ๊ฐ์ฒด๊ฐ ๋ ์ ์๋ค. ํด๋์ค๋ฅผ ํตํด ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ฅผ ํน๋ณํ ์ธ์คํด์ค๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์์ฑ์๋ ํด๋์ค์ ์ธ๋ถ ์ฌํญ(์์ฑ/property)์ ๋ฃ์ด์ฃผ๋ ์ญํ ์ ํ๋ค. (ํจ์์ ์ธ์๋ฅผ ๋ฃ๋ฏ, ์์ฑ์๋ ์์ฑ์ ํด๋์ค์ ๋ฃ๋๋ค.)
ํด๋์ค์์ ์ ์ํ ๊ฒ์ ํ ๋๋ก ์ค์ ๋ฉ๋ชจ๋ฆฌ์์ ํ ๋น๋ ๊ฒ์ผ๋ก ์ค์ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ
๋น์ทํ ์ญํ ์ ํ๋ ์์ฑ๊ณผ ๋ฉ์๋๋ค์ ํ๋์ ํด๋์ค๋ก ๋ชจ์ ๊ฒ์ ์บก์ํ๋ผ๊ณ ํ๋ค. ์ด ์บก์ํ์ ๋ชฉ์ ์ ์ฝ๋๋ฅผ ์ฌ์์ ์์ด ์ฌํ์ฉํ๋ ๊ฒ์ด๋ค.
๋ํ ์บก์ํ์ ์ธก๋ฉด ์ค ์๋ํ๋ ์๋ค.
์๋ํ๋ ๋ด๋ถ ๋ฐ์ดํฐ๋ ๋์์ด ์ธ๋ถ๋ก ๋ ธ์ถ๋์ง ์๋๋ก ๋ง๋๋ ๊ฒ์ด๋ค.
์๋๋ ์๋ํ์ ์์๋ค.
๊ฐ๊ฐ ํด๋ก์ ์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ ๊ตฌํํ ๊ฒ์ด๋ค.
< ํด๋ก์ >
// ํด๋ก์ ๋ฅผ ํตํด ๊ตฌํํ ์๋ํ์ ์์ function makeCounter() { let value = 0 return { increase: function() { value++ // ๋ฉ์๋ ํธ์ถ์ ํ ๊ฒฝ์ฐ, this๋ makeCounter ํจ์๊ฐ ๋ฆฌํดํ๋ ์ต๋ช ์ ๊ฐ์ฒด์ ๋๋ค }, decrease: function() { value-- }, getValue: function() { return value; } } } let counter1 = makeCounter() counter1.increase() counter1.getValue() // 1 let counter2 = makeCounter() counter2.decrease() counter2.decrease() counter2.getValue() // -2
< ํด๋์ค >
class Counter { constructor() { this.value = 0; } increase() { this.value++; } decrease() { this.value--; } getValue() { return this.value; } } let counter1 = new Counter() counter1.increase() counter1.getValue() // 1 counter1.value // 1: ์ ๊ทผ๊ฐ๋ฅ let counter2 = new Counter() counter2.decrease() counter2.decrease() counter2.getValue() // -2 counter2.value // 2: ์ ๊ทผ๊ฐ๋ฅ
๋ถ๋ชจ ํด๋์ค์ ํน์ง์ ์์ ํด๋์ค๊ฐ ๋ฌผ๋ ค ๋ฐ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ฆ ๊ธฐ๋ณธ ํด๋์ค(base class)์ ํน์ง์ ํ์ํด๋์ค(derive class)๊ฐ ์์ ๋ฐ๋๋ค.
๋ด๋ถ ๊ตฌํ์ ๋ณต์กํ๋ฐ, ์ค์ ๋ก ๋ ธ์ถ๋๋ ๋ถ๋ถ์ ๋จ์ํ๊ฒ ๋ง๋ ๋ค๋ ๊ฐ๋ ์ด๋ค.
์ฆ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋์ด ํ์ํ์ง ์์ ๋ฉ์๋ ๋ฑ์ ๋ ธ์ถ์ํค์ง ์๊ณ , ๋จ์ํ ์ด๋ฆ์ผ๋ก ์ ์ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ฐ์ base class์์ ์์ ๋ฐ์ ๋ฉ์๋๊ฐ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด ์์์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์๋ํ๋ ๊ฒ
์ฐธ๊ณ ํ ๋งํ ์๋ฃ
- introduction to object oriented programming, Moutaz Haddara
๋งํฌ๐
https://www.slideshare.net/haddara1/introduction-to-object-oriented-programming-42639494
ํ๋กํ ํ์ MDN๋ฌธ์
https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Object_prototypes
ํ๋กํ ํ์ ๊ด๋ จํ์ฌ ์ค๋ช ๋์ด ์๋ ์ฌ์ดํธ
(์ด ๊ธ์ ์ด ์ฌ์ดํธ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑ ๋์์ต๋๋ค.)
https://poiemaweb.com/js-prototype
Javascript์์์ ์์ MDN ๋ฌธ์
https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Inheritance
JavaScript
๋ Java
, C++
๊ฐ์ ํด๋์ค ๊ธฐ๋ฐ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์๋ ๋ค๋ฅด๊ฒ, ํ๋กํ ํ์
๊ธฐ๋ฐ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ๊ฐ์ฒด๋ ๋ถ๋ชจ ์ญํ ์ ๋ด๋นํ๋ ๊ฐ์ฒด์ ์ฐ๊ฒฐ ๋์ด์๋ค. ์ด๋ก ์ธํด ๋ถ๋ชจ ๊ฐ์ฒด์ property
๋ method
๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. ์ด๋ฌํ ๋ถ๋ชจ ๊ฐ์ฒด๋ฅผ 'Prototye ๊ฐ์ฒด'
๋๋ 'Prototype'
์ด๋ผ๊ณ ํ๋ค.
์ ์ฌ์ง์ ๋ณด๋ฉด instance์ธ me
์ __proto__
์์ prototype ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.(์ ํํ๊ฒ ์ด์ผ๊ธฐ ํ๋ฉด ์์ ์ ๋ถ๋ชจ ๊ฐ์ฒด(prototype ๊ฐ์ฒด)์ธ CallName.prototype์ ๊ฐ๋ฆฌํค๊ณ ์๋ค.)
__proto__
vs .prototype์ด ๋์ด ์กฐ๊ธ ํท๊ฐ๋ ค์ ์ ๋ฆฌํ๊ณ ๋์ด๊ฐ์ผ๊ฒ ๋ค.
์ ์๋ ๋ชจ๋ ๊ฐ์ฒด๋ [[Prototype]]์ด๋ผ๋ internal slot์ ๊ฐ๊ฒ ๋๋ฉฐ, ์ด๋ ์์์ ์ํด ์ฌ์ฉ๋๋ค. ๋ํ ์ด๋__proto__
ํ๋กํผํฐ๋ก ์ ๊ทผํ ์ ์๋ค.
ํ๋ ํจ์๋ [[Prototype]] ์ธ์ ํ์์ธ .prototype ์ฆ, prototype ํ๋กํผํฐ๋ ๊ฐ๊ณ ์๋ค.
์ฆ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ ์ ์๋ค.
[[Prototype]]
1)__proto___
๋ฅผ ํตํด ์กฐํํ ์ ์๋ค.
2) ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ internal slot์ด๋ค.
3) ๊ฐ์ฒด์ ์ ์ฅ์์ ๋ถ๋ชจ ์ญํ ์ ํ๋ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
prototype ํ๋กํผํฐ
1) ํจ์ ๊ฐ์ฒด๋ง ๊ฐ๊ณ ์๋ ํ๋กํผํฐ
2) ํจ์ ๊ฐ์ฒด๊ฐ ์์ฑ์๋ก ์ฌ์ฉ๋ ๋, ์ด ํจ์์ ์ํด ๋ง๋ค์ด์ง ๊ฐ์ฒด์ prototype ๊ฐ์ฒด๋ค.Constructor ํ๋กํผํฐ
me๋ผ๋ ๊ฐ์ฒด์ constructor๋ ์์ ์ ์์ฑ์ ํจ์๋ค.๋ฐ๋ผ์, me๋ผ๋ ๊ฐ์ฒด์ ํ๋กํ ํ์ ๊ฐ์ฒด๋
CallName.prototype
์ด๋ฉฐ,
CallName.prototype
์ ์๋constructor
ํ๋กํผํฐ๋ CallName() ์์ฑ์ ํจ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์ด ๋ถ๋ถ์ ES6 ๋ฌธ๋ฒ ์ด์ ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ํ๊ณ ๋ง๋ค์ด์ง์ง ์์ JS์์ OOP๋ฅผ ๊ตฌํํ๋ ๋ฐฉ์์ด์๋ค๊ณ ํ๋ค.
๋ํ ES6 ์ดํ๋ก๋ ๋งค์ฐ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก OOP์ ๊ตฌํ์ด ๊ฐ๋ฅํด์ก์ง๋ง ์๋์๋ฆฌ๋ ๊ฐ๋ค๊ณ ํ๋ค. ๋ฐ๋ผ์ ๊ทธ ์๋์๋ฆฌ์ ๋ํ ์ดํด๋ฅผ ํ๊ธฐ ์ํด ์์ฑํ์๋ค.
let Human = function(name) { this.name = name }
Human.prototype.sleep = function() {};
let Student = function(name){};
Student.prototype.learn = function(){console.log('JS')};
let Me = new Student('KIM');
Me.learn(); // JS
Me.sleep(); // err: Me.sleep is not a function
์ ์ฝ๋์์ Me.sleep()์ ์๋ํ์ง ์๋๋ค. ๊ทธ ์ด์ ๋ Human ํด๋์ค์ method๋ฅผ ์ ๋ฌ ๋ฐ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
Me.__proto__
= Human.prototype
Me์ prototype ๊ฐ์ฒด๊ฐ
Human.prototype
์ด ๋์ด๋ฒ๋ ค์Me.learn()
์ด ์๋ํ์ง ์๋๋ค.
์ฆStudent.prototype
๊ณผ์ ์ฐ๊ฒฐ์ด ๋๊ฒจ๋ฒ๋ ธ๋ค.์ด๋ฐ ํ์๋ ๊ณต์ ๋ฌธ์์์ ํ์ง ๋ง๋ผ๊ณ ์ง์ ํ๋ค๊ณ ํ๋ค!
Warning
Stuudent.prototype.__proto__ = Human.prototype
๋ฅผ ํ๋ฉด, ์ํ๋ ๋ฐ๋ก ์๋ํ๊ฒ ๋๋ค. ์ฆ Student๋ฅผ ์ด์ฉํด ์์ฑ๋ instance๊ฐ Human์ method๋ฅผ ๊ฐ๊ฒ ๋๋ค.
๐คฏํ์ง๋ง ์ ์ ํ์ฟ๋ฏ์ด__proto__
์ ์ง์ ํ ๋นํ๋ ํ์๋ ๊ณต์ ๋ฌธ์์์ ๊ธ์งํ์๋ค.
Student.prototype
= Human.prototype
let Human = function(name) { this.name = name }
Human.prototype.sleep = function() {};
let Student = function(name){};
Student.prototype = Human.prototype // <-- chnaged
Student.prototype.learn = function(){console.log('JS')}; // <-- changed
//์ ์ค์ Human.prototype.learn์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ ํ์๊ฐ ๋๋ค.
let Me = new Student('KIM');
Me.learn(); // JS
Me.sleep();
Student.prototype = Human.prototype
์ด ๋ถ๋ถ๋ง ์ฝ์ ํ๋ฉด learn์ด ์๋ํ์ง ์๋๋ค.Student.prototype.learn = function(){console.log('JS')};
์ด ๋ถ๋ถ๊น์ง ์ฝ์ ํ๋ฉด learn๋ ์๋ํ๊ฒ ๋์ง๋ง,Student.prototype
์ดHuman.prototype
๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์,Student...
์ ๊ฐ์ ๋ฐ๊พธ๋ฉดHuman...
์ ๊ฐ๋ ๋ฐ๋๋ค.
๋ฐ๋ผ์ Human์ดlearn() method
๋ฅผ ๊ฐ๊ฒ ๋๋ค.๐
Human.prototype
์ ๋ณต์ฌ! ๐1)
let Human = function(name) { this.name = name }
Human.prototype.sleep = function() {};
let Student = function(name){};
Student.prototype = Object.create(Human.prototype) // <-- chnaged
// Object.create(<prototype>)์ ์ธ์๋ก ๋ค์ด์จ prototype์ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด prototype์ ๋ง๋ ๋ค.
Student.prototype.learn = function(){console.log('JS')}; // <-- changed
let Me = new Student('KIM');
Me.learn(); // JS
Me.sleep();
ํ์ง๋ง ์ฌ๊ธฐ์ ๋ชจ๋ ๋๋ ๊ฒ์ด ์๋๋ค.
2)
ํ์ฌ Me์ [[Prototype]]
์์ Constructor
๊ฐ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ฆ Student() ์์ฑ์ ํจ์
์์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๊ฐ ์ฌ๋ผ์ก๋ค.
์ฌ์ง์ด constructor
๋ฅผ ์ฐ์ด๋ณด๋ฉด Human() ์์ฑ์ ํจ์
๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค.
๋ฐ๋ผ์, Me์ Student() ์์ฑ์ ํจ์๋ฅผ ์ด์ด์ฃผ์ด์ผ ํ๋ค.
//...์๋ต
Student.prototype = Object.create(Human.prototype) // <-- chnaged
// Object.create(<prototype>)์ ์ธ์๋ก ๋ค์ด์จ prototype์ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด prototype์ ๋ง๋ ๋ค.
Student.prototype.learn = function(){console.log('JS')}; // <-- changed
Student.prototype.constructor = Student;
//์์ฑ์ ํจ์๋ฅผ Student.prototype.constructor๋ก ์ง์ ์ง์ ํ๋ค.
//์๋ต...
3)
์์ง๋ ๋ฌธ์ ๊ฐ ์๋ค.
Me๋ฅผ ์์ฑํ ๋, Student() ์์ฑ์ ํจ์
์ 'KIM'
์ด๋ผ๋ ์ธ์๋ฅผ ์ ๋ฌํ์์๋ ๋ถ๊ตฌํ๊ณ Human() ์์ฑ์ ํจ์
์ ์ํด name property
๊ฐ ์์ฑ ๋์ง ์๊ณ ์๋ค.
//...์๋ต
let Student = function(name){
Human.call(this,name) // Human.apply(this, arguments)// <<-- changed
};
Student.prototype = Object.create(Human.prototype)
Student.prototype.learn = function(){console.log('JS')};
Student.prototype.constructor = Student;
//...์๋ต
์์ง ์ด ๋ถ๋ถ์ด ํ์ฐํ ์๋ฟ์ง๋ ์๋๋ค.
๋ค๋ง, Student() ์์ฑ์ ํจ์
์์ Human.call(this,name)
์ฝ๋๋ก this์ name arg๋ฅผ ๋ฐ์ธ๋ฉํ์ฌ ๊ฐ์ ๋ก ์คํ์ํค๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
this๋ instance๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์, ์๋ฌด๊ฒ๋ ํ์ง ์์ผ๋ฉด, Human() ์์ฑ์ ํจ์ ์์ ์๋ this๋ ๊ฐ๋ฆฌํค๋ ๋์์ด ์๋ค.
๋คํ์ฑ์ ๋ง์กฑ์ํค๊ธฐ ์ํด... ํ๋๋ฅผ ...๋...
๋ง์ฝ ์์ ์์์์ Student.prototype ์์ sleep์ด๋ผ๋ method๋ฅผ ํ๋ ์ถ๊ฐํ๋ค๊ณ ์๊ฐํด๋ณด์.
๋จ, ๊ธฐ์กด์
Human.prototype.sleep = function(){ console.log('zzz') })
์ด๋ผ๊ณ ๊ฐ์ ํ๋ค.
์ด๋, Student.prototype.sleep์ ์คํ์์ผฐ์ ๋,
'zzz'๋ ์ฝ์์ ์ฐํ ์ ์๊ฒ ๋ง๋ค์ด์ฃผ๊ณ ์ถ๋ค๋ฉด?Student.prototype.sleep = function(){ Human.prototype.sleep.apply(this) console.log('do not sleep!') }
์ด๋ ๊ฒ ๋๋ฉด,
Student ์์ฑ์ ํจ์๋ก ๋ง๋ Instance๋ค์์ sleep method๋ฅผ ๋์์์ผฐ์ ๋,'zzz' 'do not sleep!'
์ด ๋์์ ์ฐํ๋์จ๋ค.
class BlinkyDancerClass extends DancerClass {
// your code here
constructor(top, left, timeBetweenSteps){
super(top, left, timeBetweenSteps)
//superclass์ method์ property๋ฅผ ์ด์ด๋ฐ๋ ๋ถ๋ถ.
}
step(){
super.step() //superclass์ step method์ ํน์ฑ์ ์ด์ด๋ฐ๋ ๋ถ๋ถ.
let style = this.$node.style;
style.display = style.display === 'none' ? 'inline-block' : 'none';
}
}