λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Dev Note

JavaScript μ—μ„œλŠ” ν•¨μˆ˜ν˜•ν”„λ‘œκ·Έλž˜λ°μ΄ λŒ€μ„Έλ‹€? (ν•¨μˆ˜ν˜• vs 객체지ν–₯)

by iyos 2023. 4. 9.

 

Why?

 πŸ’¬ μš”μ¦˜μ—” 주둜 javascript λ₯Ό ν™œμš©ν•˜μ—¬ κ°œλ°œμ„ ν•˜κ³  곡뢀λ₯Ό ν•˜κ³  ν˜‘μ—…μ„ ν•˜λ‹€λ³΄λ‹ˆ 같은 언어인데도 μ‚¬λžŒλ§ˆλ‹€ 정말 λ‹€μ–‘ν•œ μ½”λ“œ μŠ€νƒ€μΌλ‘œ μž‘μ—…μ„ ν•œλ‹€κ³  λŠλ‚€λ‹€. 보톡은 주둜 ν™œμš©ν•˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ ν”„λ ˆμž„μ›Œν¬κ°€ μ½”λ“œμŠ€νƒ€μΌμ— 영ν–₯을 많이 μ£ΌλŠ” 것 같은데, λ‚˜μ˜ νšŒμ‚¬μ˜ 경우 ν”„λ ˆμž„μ›Œν¬ 없이 ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμ„ ν•˜κ³  μžˆμ–΄ λ”μš± λ©€λ²„λ“€μ˜ μžμœ λ„κ°€ λ†’λ‹€.

κ·Έλž˜μ„œ 문득 'μ–΄λ–€ μ΄μœ μ™€ μ˜λ„λ‘œ μ§€κΈˆμ˜ λ°©μ‹μœΌλ‘œ ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜κ³ μžˆλŠ” κ²ƒμΌκΉŒ?' λΌλŠ” 생각, 'κ³Όμ—° κ·Έ 방법은 λ‚΄κ°€ κ°œλ°œν•˜κ³ μž ν•˜λŠ” μ„œλΉ„μŠ€μ— μ΅œμ ν™”λ˜μ–΄μžˆμ„κΉŒ?' λΌλŠ” 생각이 λ“€μ–΄ ν•¨μˆ˜ν˜•κ³Ό 객체지ν–₯에 λŒ€ν•΄μ„œ κ°„λ‹¨νžˆ 정리λ₯Ό ν•΄ λ³΄μ•˜λ‹€. 그리고 λ™λ£Œλ“€λ„ λ‹€λ“€ μ–΄λ–€ 이유둜 본인의 μŠ€νƒ€μΌμ„ λ§Œλ“€μ—ˆκ³  μœ μ§€ν•˜κ²Œ λ˜μ—ˆλŠ”μ§€κ°€ κΆκΈˆν•΄μ„œ 이야기λ₯Ό λ‚˜λˆ λ³΄μ•˜λ‹€.

 

 

1. 객체지ν–₯ν˜• vs ν•¨μˆ˜ν˜•

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° - Functional programming (FP)
  • 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° - Object oriented programming (OOP)

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(FP)은 ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„ 쀑 ν•˜λ‚˜μ΄κ³ , κ°μ²΄ 지ν–₯ ν”„λ‘œκ·Έλž˜λ° (OOP)도 ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„ 쀑 ν•˜λ‚˜μ΄λ‹€. λ‘˜ λ‹€ 개발 λ°©μ‹μ˜ 차이일 뿐 'μ–΄λ–€κ²Œ 더 λ‚«λ‹€'λΌλŠ” λͺ…ν™•ν•œ 기쀀이 μžˆλŠ” 것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ—, 본인이 κ°œλ°œν•˜λŠ” μ„œλΉ„μŠ€μ™€ λ•Œμ— 맞게 잘 ν™œμš©ν•˜λŠ” 것이 쒋은 선택이라고 λ³Ό 수 μžˆλ‹€. 

 

 

 

1) 객체지ν–₯ (OOP: Object Oriented Programming)

 ν”„λ‘œκ·Έλž˜λ°ν•˜λ €λŠ” λŒ€μƒμ„ ν•˜λ‚˜μ˜ 객체(사물)둜 μ •μ˜ν•˜λŠ” 섀계 λ°©λ²•μœΌλ‘œ 객체의 κ΄€μ μ—μ„œ ꡬ쑰λ₯Ό λ§Œλ“€κ³  μ‚¬μš©ν•˜λŠ” 방법이닀. 객체λ₯Ό κ΅¬μ‘°ν™”ν•œλ‹€λŠ” 말은 λ‹¨μˆœν•œ 자료 ꡬ쑰(λ³€μˆ˜)λ₯Ό λ„˜μ–΄μ„œ κΈ°λŠ₯(λ©”μ„œλ“œ)을 ν¬ν•¨ν•œ ν˜•νƒœλ‘œ 객체λ₯Ό μ‚¬μš©ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. 객체지ν–₯을 μ§€μ›ν•˜λŠ” μ–Έμ–΄λŠ” μ—¬λŸ¬ 가지가 μžˆμ§€λ§Œ λŒ€ν‘œμ μΈ μ–Έμ–΄λ‘œλŠ” Java, C# κ°€ μžˆλ‹€.

 

객체지ν–₯λ°©μ‹μœΌλ‘œ js κ°œλ°œμ„ ν–ˆμ„λ•Œ λ‚˜νƒ€λ‚˜λŠ” κ°€μž₯ 큰 νŠΉμ§•μ€ 객체 내뢀에 μƒνƒœλ³€μˆ˜μ™€ λ©”μ†Œλ“œλ₯Ό 가지고 있고, 그듀끼리 κΈ΄λ°€ν•œ 관계λ₯Ό 맺을 수 μžˆλ‹€. 그리고 클래슀둜 λ§Œλ“€μ–΄μ§„ μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ λ‹€λ₯Έ μƒνƒœκ°’μ„ 가지고 있기 λ•Œλ¬Έμ—, 같은 μΈμžκ°’μ— λŒ€ν•΄ λ‹€λ₯Έ 결과값이 리턴될 수 μžˆλ‹€.

 

function Car() {
  this.power = false;
  this.position = 0;
}

Car.prototype.start = function() {
  this.power = true;
  console.log('μžλ™μ°¨ μ‹œλ™');
}

Car.prototype.moveTo = function(position) {
  console.log(`μžλ™μ°¨ 이동 = ν˜„μž¬ μœ„μΉ˜: {${this.position}}`);

  if (!this.power) {
    console.log('μžλ™μ°¨μ˜ μ‹œλ™μ΄ κΊΌμ ΈμžˆμŠ΅λ‹ˆλ‹€.');
    return;
  }

  this.position = position;
  console.log(`μžλ™μ°¨ 이동 = 이동 μœ„μΉ˜: {${this.position}}`);
}

const car = new Car();
car.start();
car.moveTo(10);

 

 

2) ν•¨μˆ˜ν˜• (FP: Functional Programming)

 ν”„λ‘œκ·Έλž˜λ°ν•˜λ €λŠ” 문제λ₯Ό ν•¨μˆ˜λ“€μ˜ μ •μ˜μ™€ 쑰합을 ν†΅ν•΄μ„œ ν•΄κ²°ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° 방법이닀. μ •ν™•νžˆλŠ” ν•¨μˆ˜μ˜ κ°œλ…μ„ μ΅œμš°μ„ μ μœΌλ‘œ μ‚¬μš©ν•΄μ„œ λͺ¨λ“  문제λ₯Ό ν•΄κ²°ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° κΈ°λ²•μœΌλ‘œ, μž₯점은 μ–Έμ œλ“  κ²°κ³Όκ°€ λ™μΌν•œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 있고 κ·Έ ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ 쑰합성을 높일 수 μžˆλ‹€λŠ” 점이닀.

 

ν•¨μˆ˜ν˜•μ˜ 경우 전달받은 μΈμžκ°’μ„ μ€‘μ‹¬μœΌλ‘œ 결과값을 λ°˜ν™˜ν•˜λŠ” κ°„κ²°ν•œ λ°©μ‹μœΌλ‘œ, 데이터λ₯Ό ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λ”°λ‘œ μ €μž₯ν•˜κ±°λ‚˜ ν•˜μ§€ μ•ŠλŠ”λ‹€. 그리고 ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜λ“€μ˜ μ‘°ν•©μœΌλ‘œ λ‘œμ§μ„ μ²˜λ¦¬ν•œλ‹€.

 

function start(car) {
  car.power = true;
  console.log('μžλ™μ°¨ μ‹œλ™');
}

function moveTo(car, position) {
  console.log(`μžλ™μ°¨ 이동 = ν˜„μž¬ μœ„μΉ˜: {${car.position}}`);

  if (!car.power) {
    console.log('μžλ™μ°¨μ˜ μ‹œλ™μ΄ κΊΌμ ΈμžˆμŠ΅λ‹ˆλ‹€.');
    return;
  }

  car.position += position;
  console.log(`μžλ™μ°¨ 이동 = 이동 μœ„μΉ˜: {${car.position}}`);
}

const car = { power: false, position: 0 };
start(car);
moveTo(car, 10);

 

 

 

κ²°κ΅­ μ°¨μ΄λŠ”? μ„€κ³„μ˜ 관점이닀!

객체지ν–₯은 "객체" μ€‘μ‹¬μ˜ 섀계λ₯Ό ν•˜λŠ” 반면 ν•¨μˆ˜ν˜•μ€ "ν•¨μˆ˜" μ€‘μ‹¬μ˜ 섀계λ₯Ό ν•œλ‹€.

// 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°
bus.start();
bus.moveTo(10);

// ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°
start(bus);
moveTo(bus, 10);

 

 λ‚˜λŠ” 사싀 개인적으둜 μžλ°”λ‘œ κ°œλ°œμ„ μž…λ¬Έν–ˆκΈ°λ•Œλ¬Έμ— '객체지ν–₯적인 사고'κ°€ μ΅μˆ™ν–ˆκ³ , Javascript λ₯Ό 잘 ν™œμš©ν•˜λŠ” 방법에 λŒ€ν•΄μ„œ 처음 κ³ λ―Όν–ˆμ„λ•Œλ„ es6 λ¬Έλ²•μ—μ„œ λ‚˜μ˜¨ 클래슀λ₯Ό 잘 ν™œμš©ν•˜μ—¬ λͺ…λ Ήν˜•μœΌλ‘œ κΈ°λŠ₯을 κ΅¬μ„±ν•˜λŠ”κ²Œ μ’‹λ‹€κ³  생각을 ν–ˆμ—ˆλ‹€. 

 

ν•˜μ§€λ§Œ κ·Έλ ‡κ²Œ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό λ§Œλ‚˜κ³  μ•„μ£Ό λ‹Ήν™©ν–ˆλ‹€. 객체 지ν–₯의 κ΄€μ μ—μ„œ classλŠ” μ–΄λ”” μžˆμ§€? interfaceλŠ” μ–΄λ”” μžˆμ§€?  private, protectedκ°€ μ—†μœΌλ©΄ μΊ‘μŠν™”λŠ” μ–΄λ–»κ²Œ ν•˜μ§€? λ“±. 그리고 κ°€μž₯ κ°„λ‹¨ν•˜κ²Œ 객체지ν–₯ λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•œ μ½”λ“œλ₯Ό λ™μž‘μ‹œν‚€λ‹€κ°€ λ§ˆμ£Όν•œ λ¬Έμ œλŠ” 'this' λ₯Ό λ°”μΈλ”©ν•˜μ—¬ ν™œμš©ν•˜λŠ” λ°μ—μ„œ μ˜€λŠ” λ¬Έμ œμ˜€λ‹€. this λŠ” μ„ μ–Έλœ μ‹œμ μ΄ μ•„λ‹Œ, 호좜된 μˆœκ°„μ˜ ν™˜κ²½μ— 따라 λ‹€λ₯Έ 값이 ν• λ‹Ήλ˜κΈ° λ•Œλ¬Έμ— ν˜ΈμΆœλ˜λŠ” 과정쀑에 μƒνƒœμ˜ λ³€ν™”κ°€ 생기면 κ²°κ³Ό 값이 λ‹€λ₯΄κ²Œ λ‚˜νƒ€λ‚¬λ‹€.

 

κ·Έλ ‡κ²Œ ν•΄λ‹Ή κΈ°λŠ₯의 κ΅¬ν˜„λ°©μ‹μ— λŒ€ν•œ λ¬Έμ œμ μ„ 느껴 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλ‘œ λ¦¬νŒ©ν† λ§μ„ ν•΄λ³΄μ•˜λ‹€. 전달받은 μΈμžκ°’(props) 이 this 처럼 호좜 μ‹œμ κ³Ό 상관없이 바뀔일이 μ—†κΈ° λ•Œλ¬Έμ— μ»΄ν¬λ„ŒνŠΈμ˜ 버그도 λ°œμƒν•˜μ§€ μ•Šμ•˜κ³ , 무엇보닀 ν΄λž˜μŠ€ν˜• 보닀 μž‘μ„±ν•  μ½”λ“œλŸ‰μ΄ ν™• 쀄고 가독성도 μ’‹μ•„μ‘Œλ‹€. 사싀 ν•΄λ³΄λ©΄μ„œ 직접 λŠλ‚€κ²Œ κ°€μž₯ 크긴 ν–ˆμ§€λ§Œ, JS λΌλŠ” μ–Έμ–΄μ˜ νŠΉμ„±κ³Ό 탄생배경을 μ™„μ „νžˆ μ΄ν•΄ν•˜μ§€ μ•Šκ³  'java의 λ°©μ‹λŒ€λ‘œ λ¬Έλ²•λ§Œ λ°”κΎΈλ©΄ λ˜λŠ”κ±° μ•„λ‹Œκ°€' 라고 μƒκ°ν•΄μ„œ μ΅μˆ™ν•œ ꡬ쑰λ₯Ό μ‚¬μš©ν–ˆλ˜ 것을 λ°˜μ„±ν•˜κ²Œ λ˜μ—ˆλ‹€. 그리고 js 의 탄생 λ°°κ²½λΆ€ν„° λ‹€μ‹œ μ•Œμ•„λ³΄μ•˜λ‹€.

 

 

 

 

2. Javascript 의 탄생비화

 μžλ°”μŠ€ν¬λ¦½νŠΈλ„ 객체지ν–₯의 νŒ¨λŸ¬λ‹€μž„μ΄ κ°€μž₯ ν•«ν•œ μ‹œκΈ°μ— λ§Œλ“€μ–΄μ§„ μ–Έμ–΄λ‹ˆ 객체지ν–₯의 영ν–₯을 받지 μ•Šμ„ 수 μ—†μ—ˆλ‹€κ³  ν•œλ‹€. μ›Ή λΈŒλΌμš°μ €μ—μ„œλŠ” μ²˜μŒλΆ€ν„° λ³΅μž‘ν•œ μ–Έμ–΄λ₯Ό λ§Œλ“€ 생각이 μ—†μ—ˆκ³ , κ·Έμ € μ•„μ£Ό κ°„λ‹¨ν•˜κ³  μž‘μ€ ν˜•νƒœμ˜ 슀크립트 μ–Έμ–΄λ©΄ 될 거라고 생각을 ν–ˆλ‹€κ³  ν•œλ‹€. Javascriptλ₯Ό μ°½μ‹œν•œ Brendan EichλŠ” μ–Έμ–΄λ₯Ό κ°œλ°œν•  λ‹Ήμ‹œ μœ ν–‰ν•˜λ˜ 객체지ν–₯에 ν•œκ³„λ₯Ό 느끼고 LISP, scheme λ“± ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ— 관심을 가지고 μžˆμ—ˆκΈ°μ—, ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ ν˜•νƒœλ‘œ μ–Έμ–΄λ₯Ό λ§Œλ“€κ³  μ‹Άμ–΄ ν–ˆλ‹€κ³  ν•œλ‹€. κ·Έλž˜μ„œ λ³΅μž‘ν•œ classλ‚˜ 섀계, μΆ”μƒν™”λ‚˜ λ‹€ν˜•μ„± 등을 λ§Œλ“€κ³  싢지 μ•Šμ•˜μ§€λ§Œ, λ‹Ήμ‹œ κ°€μž₯ 인기가 μžˆμ—ˆλ˜ Java κ°œλ°œμžλ“€μ„ λŒμ–΄λ“€μ΄κ³  μ‹Άμ—ˆκΈ° λ•Œλ¬Έμ— Java의 문법과 νŒ¨λŸ¬λ‹€μž„μ€ μ΅œλŒ€ν•œ μœ μ§€λ₯Ό ν•΄λ³΄κ³ μž λ…Έλ ₯ν–ˆκ³  classκ°€ μ—†λŠ” ν•¨μˆ˜ν˜• μ–Έμ–΄λ₯Ό 기반으둜 ν•˜μ§€λ§Œ, 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° 맛을 λŠλ‚„ 수 μžˆλŠ” λ‘˜μ˜ ν˜Όμ’…μ˜ ν˜•νƒœλ‘œ 세상에 λ‚˜μ˜€κ²Œ λ˜μ—ˆλ‹€κ³  ν•œλ‹€.

 

 κ²°λ‘ μ μœΌλ‘œλŠ” JavascriptλŠ” 객체지ν–₯κ³Ό ν•¨μˆ˜ν˜•μ˜ 2가지 관점을 λͺ¨λ‘ 가지고 μžˆλŠ” 언어기에 μ΄λŸ¬ν•œ 밸런슀λ₯Ό μž‘λŠ” 것이 μ€‘μš”ν•˜λ‹€. λ°μ΄ν„°μ™€ λ©”μ†Œλ“œλ₯Ό 기반으둜 μž‘μ€ 문제λ₯Ό λ…λ¦½μ μœΌλ‘œ ν•΄κ²°ν•  수 μžˆλŠ” μž‘μ€ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€μ–΄ μ½”λ“œμ˜ μž¬μ‚¬μš©μ„ 높이고, 개발과 μœ μ§€λ³΄μˆ˜λ₯Ό νŽΈν•˜κ²Œ ν•  수 μžˆλ‹€λŠ” κ°„κ²°ν•œ λ¬Έλ²•μ˜ μž₯점은 μ·¨ν•˜κ³ , 객체λ₯Ό μ—°κ²°ν•˜λŠ” κ³Όμ •μ—μ„œ κ³Όλ„ν•˜κ²Œ 객체지ν–₯을 톡해 λ§Œλ“€μ–΄μ§„ λ³΅μž‘ν•œ ꡬ쑰λ₯Ό λ§Œλ“€μ§€ μ•Šλ„λ‘ μ§€μ–‘ν•˜κ³ , μ μ ˆν•œ μ„  μ•ˆμ—μ„œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄ 가지고 μžˆλŠ” μž₯점과 κ²°ν•©ν•˜λŠ” 것이 ν˜„λŒ€ Javascriptμ—μ„œ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ μž˜ν•œλ‹€λΌκ³  λ³Ό 수 μžˆλ‹€.

 

 

3. λ‹€λ₯Έ λ™λ£Œλ“€μ€ μ–΄λ–»κ²Œ μƒκ°ν• κΉŒ?

 λ¬Έλ“ λ‹€λ₯Έ λ™λ£Œλ“€μ€ μ–΄λ–€ 생각을 κ°–κ³ μžˆλŠ”μ§€ κΆκΈˆν•΄μ„œ, νŒ€ ν†‘μ—μ„œ κ΄€λ ¨ 주제둜 이야기λ₯Ό λ‚˜λˆ λ³΄μžκ³  μ œμ•ˆν–ˆλŠ”λ°, 7λͺ…μ˜ λ™λ£Œλ“€μ΄ ν•¨κ»˜ μ—΄λˆ 토둠을 μ§„ν–‰ν•˜κ²Œ λ˜μ—ˆκ³ , 정말 λ§Žμ€ 의견ꡐλ₯˜κ°€ μ˜€κ°”λ‹€.

그리고 μ‹€μ œ νŒ€μ›λ“€μ˜ 사둀쀑 μ–΄λ–€ κΈ°λŠ₯κ³Ό μ–΄λ–€ κ΅¬ν˜„λΆ€μ—μ„œ ν•¨μˆ˜ν˜•/객체지ν–₯이 잘 λ§žλŠ”λ‹€κ³  μƒκ°ν•˜κ³  잘 μ•ˆλ§žλŠ”λ‹€κ³  생각이 λ“€μ—ˆλŠ”μ§€λ„ κ³΅μœ ν•  수 μžˆλŠ” κΈ°νšŒκ°€ λ˜μ—ˆλ‹€. μš”μ¦˜ νŠΉνžˆλ‚˜ js μž‘μ—… λΉˆλ„κ°€ λ†’μ•„μ Έμ„œ μ–΄λŠ λ•Œμ— μ–΄λ–€ 방식을 μ¨μ•Όν•˜λŠ”μ§€ 혼자 μƒκ°ν•˜κ³  κ΅¬ν˜„ν•˜λ©° μ‹œν–‰μ°©μ˜€λ₯Ό κ²ͺκ³€ν–ˆλŠ”λ°, κ·Έ λ‚  곡유된 νŒ€μ›λ“€μ˜ 방식도 μ μš©ν•΄λ΄μ•Όκ² λ‹€.

 

 

 

 

 

 

 

μ°Έκ³ : https://yozm.wishket.com/magazine/detail/1396/

λ°˜μ‘ν˜•