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 μμ λΉλκ° λμμ Έμ μ΄λ λμ μ΄λ€ λ°©μμ μ¨μΌνλμ§ νΌμ μκ°νκ³ κ΅¬ννλ©° μνμ°©μ€λ₯Ό κ²ͺκ³€νλλ°, κ·Έ λ 곡μ λ νμλ€μ λ°©μλ μ μ©ν΄λ΄μΌκ² λ€.