OOP & OOP in JS


ch1. ๊ฐ์ฒด

๊ฐ์ฒด?

๋ชจ๋“  ๊ฒƒ์ด ๊ฐ์ฒด๋‹ค!?

์–ด๋– ํ•œ ์‚ฌ๋ฌผ === Object.

ํ˜„์‹ค์„ธ๊ณ„๋ฅผ ์ธ์ง€ํ•˜๋ฉด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜์ž!์—์„œ ์ถœ๋ฐœ

โ‡’ ์ƒ์ƒํ•˜๊ณ ,๋ณผ ์ˆ˜ ์žˆ๊ณ ,๋งŒ์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๊ฐ์ฒด์ด๋‹ค.

๊ฐ์ฒด์˜ ๊ตฌ์„ฑ

๋ชจ๋“  ๊ฐ์ฒด๋Š” ์†์„ฑ(property)๊ณผ ํ–‰์œ„(method)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ.

  • ์†์„ฑ : ์‚ฌ๋žŒ์˜ ํ‚ค,๋‚˜์ด,๋ชธ๋ฌด๊ฒŒ

  • ํ–‰์œ„ : ์›€์ง์ด๋‹ค, ๋จน๋‹ค, ์ž๋‹ค, ๊ณต๋ถ€ํ•˜๋‹ค

people.eat();
people.getAddress();  //method~~~~
people.address;  //property

์—…๊ณ„์—์„œ ํ˜„์‹ค์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด

  • ์†์„ฑ,ํ•„๋“œ,property๋Š” ๊ฐ™์€๋ง.

  • ํ•จ์ˆ˜,๋ฉ”์„œ๋“œ๋„ ๊ฐ™์€๋ง.

ํด๋ž˜์Šค์™€ ๊ฐ์ฒด

https://www.miltonmarketing.com/wp-content/uploads/2018/04/oopconceptimage15345345.png

class

์–ด๋– ํ•œ ๊ฐ์ฒด๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด, ์ผ๋ฐ˜ํ™”๋œ ํ˜•ํƒœ๋กœ ๋งŒ๋“  ๊ฒƒ.

์–ด๋– ํ•œย ์ง‘ํ•ฉ์ด๋‚˜ ๋ถ„๋ฅ˜์— ๊ฐ€๊น๋‹ค.(์‚ฌ๋žŒ, ๋™๋ฌผ, ์ž๋™์ฐจ ๋“ฑ)
์ถ”์ƒ์ .

object(instance)

class๋ฅผ ํ†ตํ•ด์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ณ„๊ฐ์ฒด.

์œ ์ผํ•œ ์‚ฌ๋ฌผ.

์‹ค์ฒด์— ๊ฐ€๊น๋‹ค(crong, ์‚ฌ์ž, ๋ฒค์ธ )
๊ตฌ์ฒด์ .

_# OOP๊ฐ€ ์—†์—ˆ๋‹ค๋ฉด? ๋น„์Šทํ•œ ํ˜•ํƒœ์˜ ์ž๋™์ฐจ๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ‘œํ˜„๋์„๊ฒƒ์ž„. ๊ฐ์ฒด์ง€ํ–ฅ์„ ํ†ตํ•ด์„œ ์ด๋ฅผ ๊ฐ„๋‹จํ•˜๊ณ  ํšจ๊ณผ_์ ์œผ๋กœ ํ‘œํ˜„.

๊ฐ์ฒด์ง€ํ–ฅ ๊ด€๋ จ ํ•™์Šต๊ด€๊ณ„๋„

OOP ํ•ต์‹ฌ ๊ฐœ๋…

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๊ฐ•์กฐ๋œ ๊ฐœ๋…๋“ค.

  • Class

  • ์บก์Аํ™”(Encapsulation)

  • ์ƒ์†(Inheritance)

  • ๋‹คํ˜•์„ฑ(polymorphism)

  • ์ถ”์ƒํ™”(abstraction)

OOP ํ•ต์‹ฌ ๊ฐœ๋… & JavaScript

1. Class

JavaScript๋Š” class ์—†์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
ES Classes๋Š” ECMAScript 2015์—์„œ๋‚˜ ํ‘œ์ค€์œผ๋กœ ๋“ฑ์žฅ. ๊ทธ์ „์—๋Š” TypeScript ์˜ ๋„์›€์œผ๋กœ ์‚ฌ์šฉ.
์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ prototype ์†์„ฑ์„ ํ†ตํ•ด์„œ ํด๋ž˜์Šค ํ˜•ํƒœ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ.

2. ์บก์Аํ™”(Encapsulation)

๋‚ด๋ถ€์—์„œ๋งŒ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๋  ๊ฒƒ์„, ์™ธ๋ถ€์— ๊ณต๊ฐœํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•„์š”ํ•œ ๊ฒƒ์€ ์™ธ๋ถ€์— ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•œ๋‹ค.

private, public ๊ฐœ๋….
JavaScript๋„ ์ด๋ฅผ ์ง€์›ํ•˜๊ณ  ์žˆ์Œ.

module pattern์„ ํ†ตํ•ด์„œ ์ด๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๊ธดํ•จ.


3. ์ƒ์†(Inheritance)

๊ณตํ†ต๋ถ€๋ถ„์„ ๋ถ„๋ฆฌํ•ด์„œ ์žฌ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ชฉ์ .

์ƒ์œ„ํด๋ž˜์Šค์™€ ํ•˜์œ„ํด๋ž˜์Šค๊ฐ„์— ์—ฐ๊ฒฐ์„ ์ง“๋Š”๋‹ค.

  • ๋™๋™โ†’์‚ฌ๋žŒ, BMW โ†’ ์ž๋™์ฐจ, ํฌํฌ๋ ˆ์ธโ†’์ค‘์žฅ๋น„,ย ์•„๋“ค โ†’ ์•„๋น (X)

  • kind of ๊ด€๊ณ„.

prototype๊ธฐ๋ฐ˜์˜ ๊ฐ์ฒด๊ฐ„ ์—ฐ๊ฒฐ chain์„ ํ†ตํ•ด ์ƒ์†๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.

child.prototype = Object.create(parent.prototype);

ES6 Class์˜ extends ํ‚ค์›Œ๋“œ ์—ญ์‹œ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๊ฒฐ๊ตญ prototype์„ ํ†ตํ•œ ์ƒ์†๊ตฌ์กฐ์ž„.

4. ๋‹คํ˜•์„ฑ(polymorphism)

๋‹ค์–‘ํ•œ ์„ฑ์งˆ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ.

overriding์„ ํ†ตํ•œ ์žฌ์ •์˜, overloading์„ ํ†ตํ•œ ๋ฉ”์„œ๋“œ ์ค‘๋ณต์ •์˜.

JavaScript๋Š” prototype chain๋‚ด์— ๋™์ผํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋‘๊ณ  overriding๊ตฌํ˜„์€ ๊ฐ€๋Šฅ.

ํ•˜์ง€๋งŒ, interface๊ฐ€ ์—†๊ณ , method overloading์„ ๊ณต์‹์ง€์›ํ•˜์ง€ ์•Š์Œ

(๋‹ค๋งŒ,์–ด๋– ํ•œ ํƒ€์ž…์„ ์ฒดํฌํ•ด์„œ, ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‹คํ–‰ํ•˜๋„๋ก ๊ตฌํ˜„ํ•  ์ˆ˜๋Š” ์žˆ์Œ)

JavaScript์— ๋‹คํ˜•์„ฑ์ด ์กด์žฌํ•˜๋ƒ?๋Š” ์ค‘์š”ํ•œ ๋…ผ์Ÿ๊ฑฐ๋ฆฌ๋Š” ์•„๋‹˜.

์˜ค๋ฒ„๋กœ๋”ฉ์€ ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด์—์„œ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์€ ๊ฐ™์ง€๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๊ณ ,
์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ์ƒ์† ๊ด€๊ณ„์— ์žˆ๋Š” ํด๋ž˜์Šค์—์„œ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ.


5. ์ถ”์ƒํ™”(abstraction)

ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ์„ ์„ ํƒํ•ด์„œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ.

โ€˜์ฐจโ€™๋Š” โ€˜๋ฒ„์Šคโ€™ํด๋ž˜์Šค์™€ โ€˜์ค‘์žฅ๋น„โ€™ํด๋ž˜์Šค๋กœ ๊ตฌ๋ถ„์ง€์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ฒ„์Šค์™€ ์ค‘์žฅ๋น„๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์†์„ฑ๊ณผ ํ–‰์œ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ด๋ ‡๊ฒŒ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์„ ํƒํ•ด์„œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ ์ถ”์ƒํ™”๋ผ๊ณ  ํ•จ.

JavaScript์—์„œ๋„ ์ด๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๊ฑด ๋‹น์—ฐํžˆ ๊ฐ€๋Šฅ!

CH2. JS ๊ฐ์ฒด ํ‘œํ˜„๋ฐฉ๋ฒ•

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ๋Š” OOP๋ฅผ ?

1. object literal

class์—†์ด ๋ฐ”๋กœ object๋กœ ํ‘œํ˜„๊ฐ€๋Šฅ(singleton)

var healthObj = {
  name : "๋‹ฌ๋ฆฌ๊ธฐ",
  lastTime : "PM10:12",
  showHealth : function() {
    console.log(this.name + "๋‹˜, ์˜ค๋Š˜์€ " + this.lastTime + "์— ์šด๋™์„ ํ•˜์…จ๋„ค์š”");
  }
}

healthObj.showHealth();

2. Class - ES6

class๋ฅผ ์—์„œ ์ œ๊ณตํ•˜๋Š” constructor๋ผ๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์ฃผ์–ด์ง. class๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด constructor๊ฐ€ ์ž๋™ํ˜ธ์ถœ ๋จ.

constructor๋Š” instance๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜. ๋‹ค์‹œ๋งํ•ด ๊ฐ์ฒด(instance)๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜.

class Health{
  constructor(name,healthTime) {
    this.name = name;
    this.healthTime = healthTime;
  }

  showHealth(){
     console.log(this.name + "๋‹˜, ์˜ค๋Š˜์€ " + this.healthTime + "์— ์šด๋™์„ ํ•˜์…จ๋„ค์š”");
  }

}

const ho = new Health("crong", "12:12");
ho.showHealth();

https://caniuse.com/#feat=es6-class

3. Class - ES3

function์„ new ํ‚ค์›Œ๋“œ๋กœ ํ˜ธ์ถœํ•˜๋ฉด, ๊ทธ ํ•จ์ˆ˜๋Š” constructor๊ฐ€ ๋จ.

const Health = function(name,healthTime) {
  this.name = name;
  this.healthTime = healthTime;
  this.showHealth = function() {
    console.log(this.name + "๋‹˜, ์˜ค๋Š˜์€ " + this.healthTime + "์— ์šด๋™์„ ํ•˜์…จ๋„ค์š”");
  }
}

const ho = new Health("crong", "12:12");
ho.showHealth();

4. Prototype object - ES3

function Health(name, healthTime) {
  this.name = name;
  this.healthTime = healthTime;
}

Health.prototype.showHealth = function() {
  console.log(this.name + "๋‹˜, ์˜ค๋Š˜์€ " + this.healthTime + "์— ์šด๋™์„ ํ•˜์…จ๋„ค์š”");
}

const ho = new Health("crong", "12:12");
ho.showHealth();

5. Object.create - ES5

Object.create๋Š” ์ง์ ‘์ ์œผ๋กœ prototypeํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง„ ์•Š์ง€๋งŒ, Prototype object๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๋™์ผ.

const healthObj = {
  showHealth : function() {
    console.log(this.name + "๋‹˜, ์˜ค๋Š˜์€ " + this.healthTime + "์— ์šด๋™์„ ํ•˜์…จ๋„ค์š”");
  }
}

const ho = Object.create(healthObj, {
   name: { value: "crong" },
   healthTime: { value: "12:22" } 
})

ho.showHealth();

Object.create๋Š” prototype๊ธฐ๋ฐ˜ ์ƒ์†์„ ์ข€๋” ๋งค๋„๋Ÿฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํƒ„์ƒํ–ˆ๋‹ค๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Œ.

Object.create๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์†๊ตฌ์กฐ๊ฐ€ ์ž˜ ๋งŒ๋“ค์–ด์ง. ํ•˜์ง€๋งŒ ES6 Classes์˜ extend๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด์ œ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํด๋ž˜์Šค๊ฐ„ ์ƒ์† ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋จ.

object literal vs. class

1. object literal

์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์„๋•Œ, ์ฆ‰ ์ผ๋ฐ˜ํ™”ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‹จ์ˆœํžˆ object literal๋กœ ๊ฐ์ฒด๋ฅผ ํ‘œํ˜„.

2. class

ํ•˜๋‚˜ ์ด์ƒ์œผ๋กœ ๊ฐœ๋ณ„์ ์ธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•  ๋•Œ.