javascript classes - Lee-hyuna/33-js-concepts-kr GitHub Wiki
Javascript ClassesβββUnder The Hood
μλ°μ€ν¬λ¦½νΈ ν΄λμ€λ κΈ°μ‘΄μ νλ‘ν νμ κΈ°λ° μμ λ° μμ±μ ν¨μλ₯Ό ꡬνν νΈμλ¬Έλ²μ΄λ€. JS ν΄λμ€μ μ΄λ©΄μ μλ μμ΄λμ΄λ₯Ό μ΄ν΄νκΈ° μν΄μλ μμ±μ ν¨μ΄, νλ‘ν νμ λ° κΈ°ν κ΄λ ¨ κ°λ μ μ΄ν΄ν νμκ° μλ€.
1. μμ±μ ν¨μ (constructor function)
Javascriptλ λͺ¨λ κ²μ΄ λ¨μ§ ν¨μμΈ ν¨μν νλ‘κ·Έλλ° μΈμ΄μ΄κΈ° λλ¬Έμ, ν΄λμ€λ₯Ό λ§λ€κΈ° μν΄ μμ±μ ν¨μλ₯Ό μ¬μ©νλ κ²½μ°, μμ±μ ν¨μκ° μ΄λ»κ² μλνλμ§ μμ보μ.
function Vehicle(make, model, color) {
this.make = make,
this.model = model,
this.color = color,
this.getName = function () {
return this.make + " " + this.model
}
}
μμ ν¨μλ Javaμ ν΄λμ€μ κ±°μ μ μ¬ν κΈ°λ₯μ μ 곡νλ€. ν΄λΉ ν¨μλ₯Ό μ΄μ©νμ¬ Vehicle
μ νμ κ°μ²΄λ₯Ό μμ±νκΈ° μν΄ λ€μκ³Ό κ°μ΄ νλ€.:
let car = new Vehicle("Toyota", "Corolla", "Black")
let car2= new Vehicle("Honda", "Civic", "White")
μ΄κ±΄ μλ²½νλ€. κ·Έλ μ§? μ΄μ , λ¨μ§ νμ€μ μ½λλ₯Ό μ°λ κ² λ§μΌλ‘λ μνλ λ§νΌ λ§μ μ’
λ₯μ Vehicle
μ λ§λ€ μ μλ€.
νμ§λ§, μ΄ λ°©λ²μλ λͺκ°μ§ λ¬Έμ κ° μ‘΄μ¬νλ€.
μ°λ¦¬κ° new Vehicle()
μ°κ²λλ©΄, Javascript μμ§μ λ Vehicle
κ°μ²΄μ κ°κ°μ λν μμ±μ ν¨μμ 볡μ¬λ³Έμ λ§λ λ€. κ° μμ±κ³Ό λ©μλλ μ Vehicle
μΈμ€ν΄μ€λ‘ 볡μ¬λλ€. κ·Όλ° λ¬Έμ κ° λκΉμ?
μ¬κΈ°μ λ¬Έμ λ μμ±μ ν¨μμ λ©€λ² ν¨μ(λ©μλ)κ° λͺ¨λ κ°μ²΄μ λνλλ κ²μ μμΉ μλλ€λ κ²μ΄λ€.. λ λ€λ₯Έ λ¬Έμ λ λ€μκ³Ό κ°μ κΈ°μ‘΄ κ°μ²΄μ μλ‘μ΄ μμ±μ΄λ λ©μλλ₯Ό μΆκ°ν μ μλ€λ κ²μ΄λ€. :
car2.year = "2012"
μ΄ year μμ±μ μΆκ°νλ €λ©΄ ν΄λΉ μμ±μ μμ±μ ν¨μ μ체μ μΆκ°ν΄μΌνλ€.
function Vehicle(make, model, color, year) {
this.make = make
this.model = model
this.color = color
this.year = year
this.getName = function() {
return this.make + " " + this.model;
}
}
2. Prototype
Javascriptμμ μλ‘μ΄ ν¨μκ° μμ±λ λ λ§λ€, Javascript μμ§μ κΈ°λ³Έμ μΌλ‘ prototype
μμ±μ μΆκ°νλ€. prototype
μμ±μ κ°μ²΄μ΄λ©° μ΄λ₯Ό "νλ‘ν νμ
κ°μ²΄"λΌκ³ λΆλ₯Έλ€. κΈ°λ³Έμ μΌλ‘ μ΄ νλ‘ν νμ
κ°μ²΄λ ν¨μλ₯Ό κ°λ₯΄ν€λ constructor
μμ±μ κ°μ§κ³ μμΌλ©°, λ λ€λ₯Έ μμ±μΈ __proto__
λ κ°μ²΄μ΄λ€. μλ μμλ₯Ό 보μ.
__proto__
μμ±μ "dunder proto"λΌκ³ λΆλ¦¬λ©°, μμ±μ ν¨μμ νλ‘ν νμ
μμ±μ κ°λ¦¬ν€κ³ μλ€.
dunderλ λκ°μ under barλ‘ λ¬ΆμΈ λ³μ μ΄λ¦μ dunder propertiesλΌκ³ λΆλ₯΄λ pythonμμ μ λνλ€.
μμ±μ ν¨μμ μ μΈμ€ν΄μ€κ° μμ±λ λλ§λ€ __proto__
μμ±μ μ λ€λ₯Έ μμ± λ° λ©μλμ ν¨κ» μΈμ€ν΄μ€μ 볡μ¬λλ€.
μ΄μ μ΄ νλ‘ν νμ κ°μ²΄λ₯Ό μ¬μ©νμ¬ μλμ κ°μ΄ μλ‘μ΄ μμ± λ° λ©μλλ₯Ό μΆκ°ν μ μμΌλ©°, μμ±μ ν¨μμ λͺ¨λ μΈμ€ν΄μ€μμ μ¬μ©ν μ μλ€.
car.prototype.year = "2016";
νλ‘ν νμ μ λ©μ§μ§λ§, νλ‘ν νμ μ κ·Όλ²μ μ¬μ©νλ©΄μ μ£Όμν΄μΌ ν μ μ΄ λͺκ°μ§ μλ€. νλ‘ν νμ μμ±κ³Ό λ©μλλ λͺ¨λ μμ±μ ν¨μμ μΈμ€ν΄μ€κ°μ 곡μ λμ§λ§, μμ±μ ν¨μμ μΈμ€ν΄μ€ μ€ νλλΌλ μμ μμ±μ λ³κ²½νλ©΄, κ·Έ μΈμ€ν΄μ€μλ§ μ μ©λκ³ λ€λ₯Έ μΈμ€ν΄μ€μλ λ°μλμ§ μλλ€.
λ λ€λ₯Έ νκ°μ§λ λ°°μ΄κ³Ό κ°μ μ°Έμ‘° νμ μμ±μ΄ λͺ¨λ μΈμ€ν΄μ€κ°μ νμ 곡μ λλ€λ κ²μ΄λ€. μμ±μ ν¨μμ ν μΈμ€ν΄μ€κ° μ°Έμ‘° νμ μμ±μ μμ νλ©΄ λͺ¨λ μΈμ€ν΄μ€κ° λ³κ²½λλ€.
νλ‘ν νμ μ κ΄ν λ§€μ° ν₯λ―Έλ‘κ³ μμΈν κΈ°μ¬λ μ¬κΈ°μμ νμΈν μ μλ€.
3. ν΄λμ€
μμ±μ ν¨μμ νλ‘νμ μ μ΄ν΄νμΌλ©΄, μ΄μ ν΄λμ€λ₯Ό μ΄ν΄νκΈ° μ½λ€. μλνλ©΄ Javascript ν΄λμ€λ νλ‘ν νμ μ μ΄μ©νμ¬ μμ±μ ν¨μλ₯Ό μ°λ μλ‘μ΄ λ°©λ²μ λΆκ³ΌνκΈ° λλ¬Έμ΄λ€. μλμ μλ₯Ό 보μ:
class Vehicle {
constructor(make, model, color) {
this.make = make
this.model = model
this.color = color
}
getName() {
return this.make + " " + this.model
}
}
Vehicle
ν΄λμ€μ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±νκΈ° μν΄ μλμ κ°μ΄ ν΄λ³΄μ:
let car = new Vehicle("Toyota", "Corolla", "Black");
μ΄ μμ λ₯Ό μ²μμ μμ±μ ν¨μλ₯Ό μ€λͺ νλ©΄μ νλ κ²κ³Ό λΉκ΅λ₯Ό ν΄ λ³΄λ©΄ μμ£Ό λΉμ·νλ€.
μ¦ μμ μμ±ν μ½λλ μλμ μ½λμ κ°λ€.
function Vehicle(make, model, color) {
this.make = make
this.model = model
this.color = color
}
Vehicle.prototype.getName = function() {
return this.make + " " + this.model
}
let car = new Vehicle("Toyota", "Corolla", "Black");
λ°λΌμ ν΄λμ€κ° μμ±μ ν¨μλ₯Ό μννλ μλ‘μ΄ λ°©λ²μ΄λΌλ κ²μ μ¦λͺ νλ€. νμ§λ§ μ€μ ν΄λμ€μ²λΌ λ§λ€κΈ°μν΄ μλ‘μ΄ λμ λ λͺκ°μ§μ μλ‘μ΄ κ²λ€κ³Ό κ·μΉμ΄ μλ€.
- ν΄λμ€μ
constructor
λ λμνκΈ° μν΄new
ν€μλκ° νμνλ€. constructorλ μ°λ¦¬κ° μλμ²λΌ νΈμΆν κ²½μ°μλ§ λμνλ κ²μ μλ―Ένλ€.
let car = new Vehicle("Toyota", "Corolla", "Black");
κ·Έλ¬λ μμ±μ ν¨μμμ new
ν€μλ μμ΄ ν¨μμ²λΌ μ¬μ©ν μ μλ€.
ν΄λμ€ λ³μλ μμ κ°μ΄ μΈμ€ν΄μ€ν νλ €κ³ νλ©΄ λ€μκ³Ό κ°μ΄ μλ¬λ₯Ό λ°μνλ€.
-
ν΄λμ€ λ©μλλ μ΄κ±°κ° λΆκ°λ₯νλ€.(non-enumerable) Javascriptμμ κ°μ²΄μ κ° μμ±μλ
enumerable
νλκ·Έκ° μ‘΄μ¬νλ€. μ΄ νλκ·Έλ ν΄λΉ μμ±μμ μνν μΌλΆ μμ μ λν κ°μ©μ±μ μ μνλ€. ν΄λμ€μμλprototype
μ μ μλ λͺ¨λ λ©μλμ λν΄ μ΄ νλκ·Έλ₯Όfalse
λ‘ μ€μ νλ€. -
ν΄λμ€μ
constructor
λ₯Ό μΆκ°νμ§ μμΌλ©΄, λ€μκ³Ό κ°μ΄ κΈ°λ³ΈμΌλ‘ λΉconstructor
κ° μλμ μΌλ‘ μΆκ°λλ€.
constructor() {}
-
ν΄λμ€ μμ μ½λλ νμ strict λͺ¨λμ΄λ€. μ΄κ²μ μ€λ₯κ° μλ μ½λλ₯Ό μμ±νκ±°λ, μλͺ»λ μ λ ₯ λλ μ½λ μμ± μ€μ μμ±λ ꡬ문 μ€λ₯, λ€λ₯Έ κ³³μμ μ°Έμ‘° λ μ½λλ₯Ό μ€μλ‘ μ κ±°νλ κ²μ λ°©μ§ν΄ μ€λ€.
-
ν΄λμ€ μ μΈμ
νΈμ΄μ€ν
λμ§ μλλ€. Javascriptμμ νΈμ΄μ€ν μ λͺ¨λ μ μΈμ΄ νμ¬ μ€μ½ν μμ μλμΌλ‘ μ΄λνλ λ©μ»€λμ¦μ΄λ€. νΈμ΄μ€ν μ λ³μ λλ ν¨μκ° μ μΈλκΈ° μ μ μ¬μ©ν μ μκ² νλ€.
κ·Έλμ ν΄λμ€ μ μΈμ νΈμ΄μ€ν λμ§ μκΈ°μ, ν΄λμ€λ₯Ό μ μΈνκΈ° μ μλ μ¬μ©ν μ μλ€λ κ²μ μλ―Ένλ€. λ§μ½ μ¬μ©νλ €κ³ μ μλμ§ μμ μλ¬λ₯Ό 리ν΄νλ€.
μλλ λμνλ€.
νμ§λ§ μλλ λμνμ§ μλλ€.
- ν΄λμ€λ μμ±μ ν¨μλ κ°μ²΄ 리ν°λ΄κ³Ό κ°μ μμ±μ μ κ·Όν΄μ κ°μ ν λΉνλ κ²μ νμ©νμ§ μλλ€. μ€μ§ ν¨μλ getter / setterλ‘λ§ κ°λ₯νλ€. λ°λΌμ ν΄λμ€μ
property:value
μ§μ ν λΉ κ°μ΄ μλ€.
4. ν΄λμ€μ νΉμ§
1. Constructor
μμ±μλ ν΄λμ€ μ μΈμμ ν΄λμ€ κ·Έ μμ μ λνλ΄λ νΉλ³ν ν¨μμ΄λ€. ν΄λμ€ μΈμ€ν΄μ€λ₯Ό μλ‘ λ§λ€λ©΄ μμ±μκ° μλμΌλ‘ νΈμΆλλ€.
let car = new Vehicle("Honda", "Accord", "Purple");
μμ±μλ super
ν€μλλ₯Ό μ¬μ©νμ¬ λΆλͺ¨ μμ±μλ₯Ό νΈμΆ ν μ μμ΅λλ€.
ν΄λμ€λ μ€μ§ 1κ°μ μμ±μλ§ κ°μ§ μ μλ€.
2. Static Methods
μ μ λ©μλλ νλ‘ν νμ μ μ μ λ ν΄λμ€μ λ€λ₯Έ λ©μλμ λ¬λ¦¬ νλ‘ν νμ μ΄ μλ ν΄λμ€ μ체μ ν¨μμ΄λ€.
μ μ λ©μλλ static
ν€μλλ₯Ό μ¬μ©νμ¬ μ μΈλλ©°, μ£Όλ‘ μ νΈλ¦¬ν° ν¨μλ₯Ό λ§λλ λ° μ¬μ©λλ€. ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ§λ€μ§ μκ³ νΈμΆ ν μ μλ€. μλ μλ₯Ό 보μ.
class Vehicle {
constructor(make, model, color) {
this.make = make
this.model = model
this.color = color
}
getName() {
return this.make + " " + this.model
}
static getColor(v) {
return v.color
}
}
let car = new Vehicle("Honda", "Accord", "Purple");
Vehicle.getColor(car); // "purple"
ν΄λμ€ μΈμ€ν΄μ€μμ μ μ λ©μλλ₯Ό νΈμΆν μ μλ€λ μ μ κΈ°μ΅νλΌ.
3. Getters/Setters
ν΄λμ€μμ μλμ²λΌ μμ±μ κ°μ κ°μ Έμ€κ±°λ, μ€μ νκΈ° μν getters/settersλ₯Ό κ°μ§ μ μλ€.
class Vehicle {
constructor(model) {
this.model = model
}
get model() {
return this._model
}
set model(value) {
this._model = value
}
}
λ΄λΆμ μΌλ‘ , getters/settersλ ν΄λμ€μ prototype
μ μ μλμ΄ μλ€.
4. μμ
Javascriptμ ν΄λμ€λ₯Ό μμνμ¬ κ΅¬νν μ μλ€. extends
λ₯Ό μ¬μ©νλ©΄ ν΄λμ€μ μμ ν΄λμ€λ₯Ό λ§λ€ μ μλ€.
μλ₯Ό λ€μ΄ 보μ.
class Vehicle {
constructor(make, model, color) {
this.make = make
this.model = model
this.color = color
}
getName() {
return this.make + " " + this.model
}
}
class Car extends Vehicle{
getName(){
return this.make + " " + this.model +" in child class."
}
}
let car = new Car("Honda", "Accord", "Purple");
car.getName(); // "Honda Accord in child class."
getName()
λ©μλλ₯Ό νΈμΆνλ©΄ μμ ν΄λμ€μ μλ λ©μλκ° νΈμΆ λ κ²μ λ³Ό μ μλ€.
λλ‘λ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό νΈμΆν΄μΌνλ€. μμ ν΄λμ€μ λ©μλλ΄μμ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό νΈμΆνκΈ° μν΄ super
ν€μλλ₯Ό μ¬μ©νλ€.
getName()
λ©μλλ₯Ό μλμ κ°μ΄ λ°κΏ 보μ.
class Car extends Vehicle{
getName(){
return super.getName() +" - called base class function from child class."
}
}
μ΄μ getName()
μ μΈμ€ν΄μ€μμ νΈμΆνλ©΄ κ²°κ³Όκ° μλμ κ°μ΄ λ°νλλ€.
κ²°λ‘ μ μΌλ‘ Javascriptμ ν΄λμ€ λ΄λΆμ κ°λ μ μ€λͺ νλ €κ³ νμΌλ©°, κ²°κ΅μλ ν΄λμ€μ λͺκ°μ§μ νΉμ§μ λν΄ λ°°μ λ€.
μ΄ μ£Όμ μ κ΄λ ¨νμ¬ λ μμΈν κ²μ λ³΄κ³ μΆμΌλ©΄ λ°λΌμ€λ λ©μ§ κΈ°μ¬λ€μ μ½μ΄λΌ. μ΄λΏλ§ μλλΌ, μΈν°λ·μλ λ°©λν λ€λ₯Έ κΈ°μ¬λ€μ΄ λμ³λλ€.