[JavaScript] OOP - 1. What is OOP

javascript

0. Table of Contents

  1. What is OOP ๐Ÿ‘‰ Current Page
  2. Objects
  3. Prototypes
  4. Prototypical Inheritance (TBD)
  5. ES6 Classes (TBD)
  6. ES6 Modules (TBD)

1. What is OOP?

  • OOP(๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)๋ž€, ํ•จ์ˆ˜๋ณด๋‹ค๋Š” ๊ฐ์ฒด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์ด๋‹ค.
  • OOP๋Š” ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, 70๋…„๋Œ€๋ถ€ํ„ฐ ์กด์žฌํ–ˆ๋˜ ์Šคํƒ€์ผ์ด๋‹ค.
  • ์ž์ฃผ ๋ณ€ํ™”ํ•˜๋Š” tools์™€ frameworks์™€๋Š” ๋‹ฌ๋ฆฌ, OOP๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋‚˜ Tool์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง๊นŒ์ง€๋„ ์—ฌ์ „ํžˆ ์ ํ•ฉํ•˜๋‹ค.
  • C#, Java, Ruby, Python, JavaScript์™€ ๊ฐ™์€ ์–ธ์–ด์—์„œ OOP ์Šคํƒ€์ผ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. (JavaScript๋Š” ์•ฝ๊ฐ„ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์ง€๋งŒ ๋‚˜์ค‘์— ๋‹ค๋ฃฐ ์˜ˆ์ •)
  • ๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์‹ค์ œ๋กœ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๋‹ค. (ex. Angular)

1-1. ์ ˆ์ฐจ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹

  • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ธฐ ์ „์—๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ํ•จ์ˆ˜๋กœ ๋‚˜๋ˆ„๋Š” ์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฐ€์กŒ๋‹ค.
  • ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ๊ณณ์— ๋งŽ์€ ํ•จ์ˆ˜๋“ค์ด ํฉ์–ด์ง€๊ฒŒ ๋œ๋‹ค.
  • ์ ˆ์ฐจ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ƒํ˜ธ ์˜์กด์ ์ด๋ผ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ Copy & Pasteํ•˜๋ฉด์„œ ์–ฝํ˜€ ์žˆ๋Š” ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋‹ค๋ฅธ ํ•จ์ˆ˜๋„ ๋ณ€๊ฒฝํ•ด์ค˜์•ผ ํ•œ๋‹ค.
  • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์€ ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

1-2. ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹

  • ๊ด€๋ จ์ด ์žˆ๋Š” ๋ณ€์ˆ˜๋“ค๊ณผ ํ•จ์ˆ˜๋“ค์˜ ๊ทธ๋ฃน์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฌถ๋Š”๋‹ค.
  • ์ด ํ•˜๋‚˜์˜ ๋‹จ์œ„๋ฅผ ๊ฐ์ฒด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • ๊ฐ์ฒด ๋‚ด์˜ ๋ณ€์ˆ˜๋Š” ์†์„ฑ(Properties)์ด๋ผ๊ณ  ํ•˜๊ณ , ๊ฐ์ฒด ๋‚ด์˜ ํ•จ์ˆ˜๋Š” ๋ฉ”์„œ๋“œ(methods)๋ผ๊ณ  ํ•œ๋‹ค.

2. OOP์˜ 4๊ฐ€์ง€ ํ•ต์‹ฌ ๊ฐœ๋…

  1. ์บก์Šํ™” (Encapsulation)
  2. ์ถ”์ƒํ™” (Abstraction)
  3. ์ƒ์† (Inheritance)
  4. ๋‹คํ˜•์„ฑ (Polymorphism)

2-1. ์บก์Šํ™”

  • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ด€๋ จ์ด ์žˆ๋Š” ๋ณ€์ˆ˜ ๋ฐ ํ•จ์ˆ˜๋ฅผ ๊ฐ์ฒด๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ์„ ์บก์Šํ™”๋ผ๊ณ  ํ•œ๋‹ค.
  • example - ์ ˆ์ฐจ ์ง€ํ–ฅ ๋ฐฉ์‹

    let baseSalary = 3000;
    let overtime = 10;
    let rate = 20;
    
    function getWage(baseSalary, overtime, rate) {
      return baseSalaray + (overtime * rate);
    }
    • ์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์€ ๊ตฌํ˜„ ๋ฐฉ์‹์„ ์ ˆ์ฐจ์  ๊ตฌํ˜„์ด๋ผ๊ณ  ํ•œ๋‹ค.
    • ํ•œ ์ชฝ์—๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ณ  ๋‹ค๋ฅธ ์ชฝ์—๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ฆฌํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
    • getWage : ๋งŽ์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๊ฒŒ๋œ๋‹ค.
  • example - ๊ฐ์ฒด ์ง€ํ–ฅ ๋ฐฉ์‹

    let employee = {
      baseSalary: 3000,
      overtime: 10,
      rate: 20,
      getWage: function() {
        return this.baseSalary + (this.overtime * this.rate);
      }
    }
    • employee๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๊ณ  ์ด ๊ฐ์ฒด ์•ˆ์—๋Š” ์„ธ ๊ฐœ์˜ ์†์„ฑ(baseSalary, overtime, rate)์ด ์žˆ๊ณ  ํ•œ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ(getWage)๊ฐ€ ์žˆ๋‹ค.
    • getWage : ์ ˆ์ฐจ ์ง€ํ–ฅ ๋ฐฉ์‹๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๊ฐ์ฒด ์ง€ํ–ฅ ๋ฐฉ์‹์—์„œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๊ณ  this.baseSalary์™€ ๊ฐ™์ด this๋ฅผ ํ†ตํ•ด ๋ณ€์ˆ˜(์†์„ฑ)์— ์ ‘๊ทผํ•œ๋‹ค.
    • Uncle Bob says, The best functions are those with no parameters.
    • ํ•จ์ˆ˜ ๋‚ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„ ์ˆ˜๋ก ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์œ ์ง€ํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ๋‹ค.
    • ๊ฐ์ฒด ๋‚ด์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋Š” ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค.

2-2. ์ถ”์ƒํ™”

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

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

    • inner or private ๋ฉ”์„œ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค๊ณ  ํ•ด๋„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์™ธ๋ถ€๋กœ ๋ˆ„์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.
    • ์™œ๋ƒํ•˜๋ฉด ๊ทธ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ์ฒด ์™ธ๋ถ€์—์„œ ๊ฑด๋“œ๋ฆฌ๋Š” ์ฝ”๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

2-3. ์ƒ์†

  • ์ƒ์†์€ ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.
  • ๋ฐ˜๋ณต๋˜๋Š” ๊ธฐ๋Šฅ์„ ๋งค๋ฒˆ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ์„ ์ƒ์†๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

2-4. ๋‹คํ˜•์„ฑ

  • ๋‹คํ˜•์„ฑ (Polymorphism) ์—์„œ Poly๋Š” โ€œ๋งŽ์€โ€์ด๋ผ๋Š” ๋œป์ด๊ณ  morph๋Š” โ€œํ˜•ํƒœโ€๋ผ๋Š” ๋œป์ด๋‹ค.
  • ์ฆ‰, ๋‹คํ˜•์„ฑ์€ โ€œ๋งŽ์€ ํ˜•ํƒœโ€๋ผ๋Š” ๋œป.
  • ๋‹คํ˜•์„ฑ์€ if, switch์™€ ๊ฐ™์€ ์กฐ๊ฑด๋ฌธ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
  • example - ์ ˆ์ฐจ ์ง€ํ–ฅ ๋ฐฉ์‹

    switch(...) {
      case 'select':
        renderSelect();
        break;
      case 'text':
        renderTextBox();
        break;
      case 'checkbox':
        renderCheckBox();
        break;
      default:
        break;
    }
  • example - ๊ฐ์ฒด ์ง€ํ–ฅ ๋ฐฉ์‹

    element.render();
    • ๊ฐ ๊ฐ์ฒด์— render ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ  render ๋ฉ”์„œ๋“œ๋Š” ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด์˜ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•œ๋‹ค.
    • ๋”ฐ๋ผ์„œ ๊ฐ์ฒด ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฐ๊ฐ์˜ render ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

Reference



๐Ÿ‘‹@Jess2
๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ปFrontend Developer

GitHubFacebookLinkedIn