TIL/JavaScript

TIL23: [JS/Node] 객체 μ§€ν–₯ JavaScript

Deviloper😈 2021. 8. 23. 16:55

객체 μ§€ν–₯ μ–Έμ–΄(Object Oriented Programming)λž€?

객체 μ§€ν–₯ 언어와 λŒ€λΉ„ λ˜λŠ” 것이 절차적 μ–Έμ–΄μž…λ‹ˆλ‹€.

절차적 μ–Έμ–΄λŠ” 순차적으둜 λͺ…령을 μ‘°ν•©ν•œ μ–Έμ–΄λ‘œ μ΄ˆκΈ°μ— 이런 ν˜•μ‹μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ μ‚¬μš©λμŠ΅λ‹ˆλ‹€.

이와 달리 객체지ν–₯ μ–Έμ–΄λŠ” 순차적으둜 λͺ…령을 μ‘°ν•©ν•˜μ§€ μ•Šκ³  μ—¬λŸ¬ ν΄λž˜μŠ€μ™€ μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•΄μ„œ λͺ…령을 λ§Œλ“­λ‹ˆλ‹€.

ν΄λž˜μŠ€λŠ” 데이터 λͺ¨λΈμ˜ μ²­μ‚¬μ§„μž…λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€λŠ” 클래슀λ₯Ό ν™œμš©ν•œ 사둀라고 μƒκ°ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

ν΄λž˜μŠ€μ™€ μΈμŠ€ν„΄μŠ€μ— λŒ€ν•΄ μžμ„Ένžˆ μ•Œμ•„λ³΄κΈ° 전에 λ¨Όμ € 객체에 λŒ€ν•΄ λ³΅μŠ΅ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

객체의 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄μ„œλŠ” 객체.λ©”μ†Œλ“œ()λ₯Ό μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

let counter = {
  value: 0,
  increase: function() {
    this.value++
  },
  decrease: function() {
    this.value--
  },
  getValue: function() {
    return this.value
  }
}
counter.increase() // value = 1
counter.increase() // value = 2
counter.increase() // value = 3
counter.decrease() // value = 2
counter.getValue() // print 2

 

λ˜ν•œ 클래슀λ₯Ό λ§Œλ“€λ©΄ λ˜‘κ°™μ€ κΈ°λŠ₯을 ν•˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ—¬λŸ¬ 개 λ§Œλ“€ 수 있기 λ•Œλ¬Έμ— μž¬μ‚¬μš©μ„±μ΄ λ†’μ•„μ§‘λ‹ˆλ‹€.

let counter = {
  value: 0,
  increase: function() {
    this.value++
  },
  decrease: function() {
    this.value--
  },
  getValue: function() {
    return this.value
  }
}

let counter1 = counter()
counter1.increase() //value = 1
counter1.getValue() //print 1

let counter2 = counter()
counter2.decrease() // value = -1
counter2.decrease() // value = -2
counter2.getValue() // print -2

 

객체와 λΉ„μŠ·ν•˜κ²Œ ν΄λž˜μŠ€μ™€ μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ λ•Œμ—λŠ” new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ¦‰μ‹œ μƒμ„±μž(constructor) ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λ©°, λ³€μˆ˜μ— μΈμŠ€ν„΄μŠ€κ°€ ν• λ‹Ήλ©λ‹ˆλ‹€.

class Car {
  consturctor(brand, name, color) {
    this.brand = brand; // this 객체: 이 μ½”λ“œμ—μ„œλŠ” x3 === this
    this.name = name;
    this.color = color;
  } // μƒμ„±μž ν•¨μˆ˜

  refuel( ) {
    console.log('Start fuelling');
  }
    
  drive( ) {
    console.log('Start driving');
  }
}


let x3 = new Car ('bmw', 'x3', 'white'); // μΈμŠ€ν„΄μŠ€ 생성
x3.color(); // 'white'
x3.drive(); // 'Start driving'

 

OOP 의 핡심 κ°œλ…

μΊ‘μŠν™” (Encapsulation)

데이터(속성)와 κΈ°λŠ₯(λ©”μ†Œλ“œ)을 λ”°λ‘œλ”°λ‘œ μ •μ˜ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, 객체 μ•ˆμ— 데이터와 κΈ°λŠ₯듀을 λ„£μ–΄ λŠμŠ¨ν•˜κ²Œ κ²°ν•©μ‹œν‚¨λ‹€λŠ” λœ»μž…λ‹ˆλ‹€.

 

μΊ‘μŠν™” κ°œλ…μ—λŠ” μ€λ‹‰ν™”μ˜ νŠΉμ§•λ„ ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ€λ‹‰ν™”λŠ” λ‚΄λΆ€ λ°μ΄ν„°λ‚˜ λ‚΄λΆ€ κ΅¬ν˜„μ΄ μ™ΈλΆ€λ‘œ λ…ΈμΆœλ˜μ§€ μ•Šλ„λ‘ λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€.

이 νŠΉμ§•μ˜ μž₯점은 μ€λ‹‰ν™”λ˜μ–΄μžˆλŠ” λ©”μ†Œλ“œλ§Œ μˆ˜μ •ν•˜κ³ , λ…ΈμΆœλ˜μ–΄μžˆλŠ” λ©”μ†Œλ“œλŠ” μ½”λ“œ 흐름을 λ³€κ²½ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.이 덕뢄에, μ½”λ“œλ₯Ό λ³΅μž‘ν•˜μ§€ μ•Šκ²Œ λ§Œλ“€κ³ , μž¬μ‚¬μš©μ„±μ„ λ†’μž…λ‹ˆλ‹€. λ˜ν•œ μœ μ§€λ³΄μˆ˜κ°€ 더 μš©μ΄ν•΄μ§‘λ‹ˆλ‹€.

 

 

좔상화 (Abstraction)

μš°λ¦¬λŠ” ν•Έλ“œν°μ„ μ΄μš©ν•΄μ„œ μ „ν™”ν•˜κ³ , λ…Έλž˜λ₯Ό λ“£κ³ , 사진을 찍을 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ•ˆμ— μ–΄λ–€ μž₯λΉ„κ°€ μ–΄λ–»κ²Œ λ™μž‘ν•΄μ„œ λ˜λŠ”μ§€λŠ” 잘 μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€. 이런 것을 좔상화라고 ν•©λ‹ˆλ‹€. 즉, μ‚¬μš©μžμ™€ 기계 μ‚¬μ΄μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ‹¨μˆœν™”ν•˜λŠ” κ±Έ λ§ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ κ°œλ… 덕뢄에 μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§€μ§€ μ•Šλ„λ‘ ν•  수 있고, μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ§‘λ‹ˆλ‹€.

 

cf) μΊ‘μŠν™”μ™€ μΆ”μƒν™”λŠ” λ‹€μ†Œ λΉ„μŠ·ν•œ κ°œλ…μž…λ‹ˆλ‹€. λ‘˜μ˜ μ£Όμš” 차이점은 μΊ‘μŠν™”κ°€ μ½”λ“œλ‚˜ λ°μ΄ν„°μ˜ 은닉에 쀑점을 λ‘μ—ˆλ‹€λ©΄, μΆ”μƒν™”λŠ” λ³΅μž‘ν•œ 뢀뢄을 보여주지 μ•Šκ³  λ‹¨μˆœν•˜κ²Œ ν•΄μ£ΌλŠ” 것에 쀑점이 λ§žμΆ”μ–΄μ Έ μžˆμŠ΅λ‹ˆλ‹€.

 

 

상속 (Inheritance)

λΆ€λͺ¨ 클래슀의 νŠΉμ§•μ„ μžμ‹ ν΄λž˜μŠ€κ°€ λ¬Όλ €λ°›λŠ” 것을 λ§ν•©λ‹ˆλ‹€.

상속 μ—­μ‹œ μ½”λ“œλ₯Ό λ°˜λ³΅ν•˜μ§€ μ•Šμ•„λ„ 되게 μž¬μ‚¬μš©μ„±μ„ λ†’μž…λ‹ˆλ‹€.

 

 

λ‹€ν˜•μ„± (Polymorphism)

같은 λΆ€λͺ¨ λ©”μ„œλ“œλ₯Ό μžμ‹ μ—˜λ¦¬λ¨ΌνŠΈκ°€ μ‚¬μš©ν•΄λ„ 각각 μ‘°κΈˆμ”© λ‹€λ₯΄κ²Œ μž‘λ™ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€.

λ‹€ν˜•μ„± 덕뢄에 객체의 νŠΉμ„±μ΄ 달라도 같은 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆκ²Œλ˜μ–΄ νš¨μœ¨μ„±μ΄ λ†’μ•„μ§‘λ‹ˆλ‹€.

 

 

 

 

ν”„λ‘œν† νƒ€μž… (Prototype)κ³Ό 상속 (Inheritance)

ν”„λ‘œν† νƒ€μž…

μ—¬κΈ°μ„œ λ¨Όμ € ν”„λ‘œν† νƒ€μž…μ΄λž€ μ›ν˜•κ°μ²΄λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. ν”„λ‘œν† νƒ€μž…μ„ μ΄μš©ν•΄μ„œ λ©”μ†Œλ“œμ™€ 속성을 상속받을 μˆ˜λ„ 있고, μ΄λŸ¬ν•œ 일련의 상속을 ν”„λ‘œν† νƒ€μž… 체인이라고 λΆ€λ¦…λ‹ˆλ‹€. 

__proto__λ₯Ό μ΄μš©ν•˜λ©΄ λΆ€λͺ¨ 클래슀의 ν”„λ‘œν† νƒ€μž…, ν˜Ήμ€ 'λΆ€λͺ¨μ˜ λΆ€λͺ¨ 클래슀'의 ν”„λ‘œν† νƒ€μž…μ„ νƒμƒ‰ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

 

 

상속

extends와 super()λ₯Ό μ‚¬μš©ν•΄μ„œ 클래슀λ₯Ό 상속할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜ μ½”λ“œλŠ” MDN에 μžˆλŠ” μ˜ˆμ‹œλ₯Ό μ‚¬μš©ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

 

https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Inheritance#ecmascript_2015_%ED%81%B4%EB%9E%98%EC%8A%A4

 

Inheritance in JavaScript - Web 개발 ν•™μŠ΅ν•˜κΈ° | MDN

OOJS에 λŒ€ν•œ μ˜¨κ°– μž‘μ§€μ‹μ„ μ„€λͺ…ν–ˆμœΌλ‹ˆ, 이 κΈ€μ—μ„œλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μžμ‹ 클래슀λ₯Ό μƒμ†ν•˜λŠ” 방법을 μ•Œμ•„λ΄…λ‹ˆλ‹€. 덀으둜 OOJSλ₯Ό κ΅¬ν˜„ν•˜λŠ”λ° λͺ‡ κ°€μ§€ 참고사항도 μžˆμŠ΅λ‹ˆλ‹€.

developer.mozilla.org

class Person {
  constructor(first, last, age, gender,i nterests) {
    this.name = {first, last};
    this.age = age;
    this.gender = gender;
    this.interests = interests;
  }

  greeting() {
    console.log(`Hi! I'm ${this.name.first}`);
  };
  farewell() {
    console.log(`${this.name.first} has left the building. Bye for now!`)
  }
}

class Teacher extends Person {
//extendsλ₯Ό μ‚¬μš©ν•΄μ„œ 상속받을 클래슀(Person) λͺ…μ‹œ
  constructor(first, last, age, gender, interests, subject, grade) {
    super(first, last, age, gender, interests);
    //superλ₯Ό μ‚¬μš©ν•΄μ„œ μƒμœ„ν΄λž˜μŠ€μ˜ μƒμ„±μž 호좜 
    this.subject = subject;
    this.grade = grade;
  }
}

 

 

μ˜€λŠ˜μ€ νŽ˜μ–΄λΆ„κ³Ό ν•¨κ»˜ 객체 μ§€ν–₯ μ–Έμ–΄μ˜ νŠΉμ§•μ„ κ³΅λΆ€ν–ˆμŠ΅λ‹ˆλ‹€. 객체지ν–₯μ–Έμ–΄μ˜ νŠΉμ§• 쀑 ν•˜λ‚˜μΈ 상속이 μ½”λ“œμ˜ νš¨μœ¨μ„±μ„ 맀우 λ†’μ—¬μ€€λ‹€λŠ” 생각이 λ“€μ—ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ μ§€λ‚œ Section 1μ—μ„œμ˜ Reactλ₯Ό 곡뢀할 λ•Œ extendsκ°€ 무엇인지에 λŒ€ν•΄ 많이 κΆκΈˆν–ˆμ—ˆλŠ”λ°, 이번 κΈ°νšŒμ— ꢁ금증이 ν•΄κ²°λ˜μ–΄μ„œ μ’‹μ•˜μŠ΅λ‹ˆλ‹€.

νŽ˜μ–΄ ν”„λ‘œκ·Έλž˜λ°μ€ 생각보닀 많이 빨리 과제λ₯Ό ν•΄κ²°ν•΄μ„œ λ‹€λ₯Έ 방법을 문제λ₯Ό 풀어보기도 ν•˜κ³ , μ΄μ‚Όμ‹­λΆ„μ •λ„λŠ” μ„œλ‘œμ˜ νŒμ„ κ³΅μœ ν•˜κΈ°λ„ ν•˜κ³ , μ½”λ”© 곡뢀 동기에 λŒ€ν•΄ 이야기 λ‚˜λˆ„κΈ°λ„ ν–ˆμŠ΅λ‹ˆλ‹€. 항상 μƒκ°ν•˜μ§€λ§Œ μ½”λ“œμŠ€ν…Œμ΄μΈ μ˜ μž₯점은 λ‹€μ–‘ν•œ μ‚¬λžŒλ“€μ„ λ§Œλ‚  수 μžˆλŠ” 기회λ₯Ό μ œκ³΅ν•΄μ€€λ‹€λŠ” 점 κ°™μŠ΅λ‹ˆλ‹€πŸ˜Š