TIL23: [JS/Node] κ°μ²΄ μ§ν₯ JavaScript
κ°μ²΄ μ§ν₯ μΈμ΄(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μ μλ μμλ₯Ό μ¬μ©ν΄λ³΄μμ΅λλ€.
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κ° λ¬΄μμΈμ§μ λν΄ λ§μ΄ κΆκΈνμλλ°, μ΄λ² κΈ°νμ κΆκΈμ¦μ΄ ν΄κ²°λμ΄μ μ’μμ΅λλ€.
νμ΄ νλ‘κ·Έλλ°μ μκ°λ³΄λ€ λ§μ΄ 빨리 κ³Όμ λ₯Ό ν΄κ²°ν΄μ λ€λ₯Έ λ°©λ²μ λ¬Έμ λ₯Ό νμ΄λ³΄κΈ°λ νκ³ , μ΄μΌμλΆμ λλ μλ‘μ νμ 곡μ νκΈ°λ νκ³ , μ½λ© κ³΅λΆ λκΈ°μ λν΄ μ΄μΌκΈ° λλκΈ°λ νμ΅λλ€. νμ μκ°νμ§λ§ μ½λμ€ν μ΄μΈ μ μ₯μ μ λ€μν μ¬λλ€μ λ§λ μ μλ κΈ°νλ₯Ό μ 곡ν΄μ€λ€λ μ κ°μ΅λλ€π