โ๐ป 2022.05.25.Wednesday
[TIL] Day22
[SEB FE] Day22
OOP
, Object-oriented programming)
- ํ๋ก๊ทธ๋จ ์ค๊ณ ์ฒ ํ
- OOP์ ๋ชจ๋ ๊ฒ์
โ๊ฐ์ฒด'
๋ก ๊ทธ๋ฃนํ- ์ด ๊ฐ์ฒด๋ ํ ๋ฒ ๋ง๋ค๊ณ ๋๋ฉด, ๋ฉ๋ชจ๋ฆฌ์์์ ๋ฐํ๋๊ธฐ ์ ๊น์ง ๊ฐ์ฒด ๋ด์ ๋ชจ๋ ๊ฒ์ด ์ ์ง
- ์ฌ์ฌ์ฉ์ฑ์ ์ป์ ์ ์์
- ์ฌ๋์ด โ์ธ๊ณ๋ฅผ ๋ณด๊ณ ์ดํดํ๋ ๋ฐฉ๋ฒโ์ ํ๋ด ๋ธ ๋ฐฉ๋ฒ๋ก
- ํ๋์ ๋ชจ๋ธ์ด ๋๋ ์ฒญ์ฌ์ง ๐ย
class
- ๊ทธ ์ฒญ์ฌ์ง์ ๋ฐํ์ผ๋ก ํ ๊ฐ์ฒด ๐ย
instance
โ๏ธย โฐย ์ ์ฐจ์ ์ธ์ด
- ์ด๊ธฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด (ex. C, ํฌํธ๋)
- ์์ฐจ์ ์ธ ๋ช ๋ น์ ์กฐํฉ
- โย ์ ์ฐจ์ ์ฝ๋์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ์ ํํ๊ฐ ๋ฐ๋ ๋๋ง๋ค ์ฝ๋ ํ๋ฆ์ ํฐ ์ํฅ์ ๋ฏธ์ณ ์ ์ง๋ณด์ ์ด๋ ต
Interface
โ
ย ์บก์ํ
๐ย ์ฝ๋๋ ๋ฐ์ดํฐ์ ์๋์ ํฌ์ปค์ค
โ
ย ์ถ์ํ
๐ย ํด๋์ค ์ฌ์ฉ์๊ฐ ํ์ํ์ง ์์ ๋ฉ์๋๋ฅผ ๋
ธ์ถ์ํค์ง ์๊ณ , ๋จ์ํ ์ด๋ฆ์ผ๋ก ์ ์ํ๋ ๊ฒ์ ํฌ์ปค์ค
โย JS์์๋ ์๋ํ์ ํ๊ณ(private
ํค์๋๋ ์์ง๋ง, #
ํค์๋ ๋์
) & ์ถ์ํ(interface
) ๊ธฐ๋ฅ์ ๋ถ์ฌ ์กด์ฌ
โฐย ๋ฉ์๋ ํธ์ถ
๊ฐ์ฒด.๋ฉ์๋()
ํ์์ผ๋ก ๊ฐ์ฒด ๋ด์ ๋ฉ์๋ ํธ์ถ
โย ํ์ดํ ํจ์ ์ฌ์ฉ โ
โฐย ํด๋ก์ ๋ชจ๋ ํจํด ์ด์ฉ โ ์๋ก์ด ๊ฐ์ฒด ์์ฑ
function makeCounter() {
let value = 0;
return {
increase: function() {
value++;
},
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
โฐย ์์ฑ & ๋ฉ์๋
- ํด๋์ค์ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ์ธ์คํด์ค์์ ์ด์ฉ
Class
์์ฑ ๋ฌธ๋ฒ
- ํจ์๋ก ์ ์
- ํด๋์ค ์ด๋ฆ์ ๋ณดํต ๋๋ฌธ์๋ก ์์, ์ผ๋ฐ๋ช ์ฌ๋ก ์์ฑ
prototype
ํค์๋๋ฅผ ์ฌ์ฉํด์ผ ๋ฉ์๋ ์ ์ ๊ฐ๋ฅ
function Car(brand, name, color) {
// instance ์์ฑ์ ์คํ๋๋ code
this.brand = brand;
this.name = name;
this.color = color;
}
// ๋ฉ์๋ ์ ์
Car.prototype.refuel = function() {
console.log('์ฐ๋ฃ ๊ณต๊ธ!!');
}
Car.prototype.drive = function() {
console.log('์ด์ ์์!!');
}
Class
์์ฑ ๋ฌธ๋ฒ
class
ํค์๋๋ฅผ ์ด์ฉํ์ฌ ์ ์- ์์ฑ์(
constructor
) ํจ์ ์กด์ฌ (instance ์์ฑ์ ์คํ๋๋ ์ฝ๋)
class Car {
// ์์ฑ ์ ์
// ์์ฑ์ ํจ์
constructor(brand, name, color) {
// instance ์์ฑ์ ์คํ๋๋ code
this.brand = brand; // ๋ง๋ค์ด์ง ์ธ์คํด์ค์ ํด๋น ๋ธ๋๋๋ฅผ ๋ถ์ฌ
this.name = name;
this.color = color;
}
// ๋ฉ์๋ ์ ์
refuel() {
console.log('์ฐ๋ฃ ๊ณต๊ธ!!');
}
drive() {
console.log('์ด์ ์์!!');
}
}
โย this
keyword: ์ธ์คํด์ค ๊ฐ์ฒด ์๋ฏธ
Instance
new
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ- ๊ฐ๊ฐ์ ์ธ์คํด์ค๋
Car
๋ผ๋ ํด๋์ค์ ๊ณ ์ ํ ์์ฑ&๋ฉ์๋๋ฅผ ๊ฐ์ง
// ์ธ์คํด์ค ์์ฑ
let avanate = new Car('hyundai', 'avante', 'black');
// ์ธ์คํด์ค์์์ ์ฌ์ฉ
avante.color; // 'black'
avante.brand; // 'hyundai'
avante.drive(); // '์ด์ ์์!!'
// ๋ฐฐ์ด์ Array์ instance
// ๋ฐฐ์ด ์ ์ = Array์ instance ์์ฑ
let arr = new Array('software', 'engineering');
arr.length; // 2
arr.push('bootcamp'); // new element ์ถ๊ฐ
๐คทโโ๏ธย Array.prototype.push()
์์ prototype
์ด ๋ถ์ด์๋ ์ด์ ๋?
ย ย ย ย ย ๐ย push ๊ตฌํ์ด ์ํ ๊ฐ์ฒด์ ์ ์๋์ด ์๊ธฐ ๋๋ฌธ
prototype | constructor | this |
---|---|---|
๋ชจ๋ธ์ ์ฒญ์ฌ์ง์ ๋ง๋ค ๋ ์ฐ๋ ์ํ ๊ฐ์ฒด(original form) | ์ธ์คํด์ค๊ฐ ์ด๊ธฐํ๋ ๋ ์คํํ๋ ์์ฑ์ ํจ์ | - ํจ์๊ฐ ์คํ๋ ๋, ํด๋น ์ค์ฝํ๋ง๋ค ์์ฑ๋๋ ๊ณ ์ ํ ์คํ context - new ํค์๋๋ก ์ธ์คํด์ค ์์ฑ์, ํด๋น ์ธ์คํด์ค๊ฐ ๋ฐ๋ก this์ ๊ฐ |
ํด๋์ค
: ์ผ์ข ์ ์ํ(original form)์ผ๋ก, ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ์์ด๋์ด/์ฒญ์ฌ์ง (์์ฑ์ ํจ์ ํฌํจ)์ธ์คํด์ค
: ํด๋์ค์ ์ฌ๋ก(instance object) / ํด๋์ค๋ฅผ ํตํด ๋ง๋ค์ด์ง ๊ฐ์ฒด
โย ํด๋์ค์์ ์์ฑ์๋ฅผ ํตํด ์ธ๋ถ ์ฌํญ(์์ฑ)์ ๋ฃ์ผ๋ฉด ๊ฐ์ฒด๊ฐ ๋จ
- JS๋
Prototype
(์ํ ๊ฐ์ฒด) ๊ธฐ๋ฐ ์ธ์ด
๐ย ๋ชจ๋ ๊ฐ์ฒด๋ค์ด ๋ฉ์๋์ ์์ฑ๋ค์ ์์ ๋ฐ๊ธฐ ์ํ ํ ํ๋ฆฟ์ผ๋ก์จ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๋ค๋ ์๋ฏธ- โฐย ์์๋๋ ์์ฑ๊ณผ ๋ฉ์๋๋ค์ ๊ฐ ๊ฐ์ฒด๊ฐ ์๋ ๊ฐ์ฒด์ ์์ฑ์์
prototype
์์ฑ์ ์ ์๋์ด ์์
โฐย Prototype ํด์
1. ํจ์์ ๋ฉค๋ฒ์ธ prototype ์์ฑ์ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ์์ฑ
2. ํจ์์ new ์ฐ์ฐ์๋ฅผ ํตํด ์์ฑํ ๊ฐ์ฒด์ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ์ง์ ํด์ฃผ๋ ์ญํ
- ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๊ธฐ ์ํด ์ฌ์ฉ๋ ์ํ์ธ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ์จ๊ฒจ์ง ๋งํฌ๋ก์จ
ํ๋กํ ํ์
์ ์๋ฏธ- ๋ง์ ๋ธ๋ผ์ฐ์ ๋ค์ด ์์ฑ์์ prototype ์์ฑ์์ ํ์๋
__proto__
์์ฑ์ผ๋ก ๊ฐ์ฒด ์ธ์คํด์ค์ ๊ตฌํ
โย Array
๋ ํด๋์ค - ๋ฐฐ์ด์ Array ํด๋์ค์ ์ธ์คํด์ค์ด๋ฉฐ, Array.prototype์๋ push, pop ๋ฑ ๋ค์ํ ๋ฉ์๋ ์กด์ฌ
class Human {
constructor(name, age) {
this.name = name;
this.age = age;
}
sleep() {
console.log(`${this.name}์ ์ ์ ๋ค์์ต๋๋ค`);
}
}
let kimcoding = new Human('๊น์ฝ๋ฉ', 30);
// Human ํด๋์ค์ ์์ฑ์ ํจ์(constructor)๋ Human
Human.prototype.constructor === Human; // true
// Human ํด๋์ค์ prototype์ Human ํด๋์ค์ ์ธ์คํด์ค์ธ kimcoding์ __proto__
Human.prototype === kimcoding.__proto__; // true
// Human ํด๋์ค์ sleep ๋ฉ์๋๋ ํ๋กํ ํ์
์ ์์ผ๋ฉฐ,
// Human ํด๋์ค์ ์ธ์คํด์ค์ kimcoding์์ kimcoding.sleep์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
Human.prototype.sleep === kimcoding.sleep; // true
์๋ ์ฐธ๊ณ ํ๋ ์ฌ์ดํธ๊ฐ ์ดํดํ๊ธฐ ์ฝ๊ฒ ์ค๋ช ๋์ด ์์ด์ ์ฐธ๊ณ ํด์ ๊ด๊ณ๋?๋ฅผ ๊ทธ๋ ค๋ดค๋ค.
โ๏ธย ํ๋กํ ํ์ ์ ์ฝํ ๊ด๊ณ๋ฅผ ์ดํดํ๊ธฐ ์ข์๋ ์ฐธ๊ณ ์ฌ์ดํธ
โ๏ธย ํ๋กํ ํ์ ์ค์ต ๊ฐ์ด๋ ์ฌ์ดํธ