[JavaScript] 21. ν΄λ‘μ
π λͺ¨λ μλ°μ€ν¬λ¦½νΈ κ΅μ¬ 24μ₯. ν΄λ‘μ
MDNμμ μ μνλ ν΄λ‘μ λ λ€μκ³Ό κ°λ€.
ν΄λ‘μ λ ν¨μμ κ·Έ ν¨μκ° μ μΈλ λ μ컬 νκ²½κ³Όμ μ‘°ν©μ΄λ€.
01. λ μ컬 μ€μ½ν
ν΄λ‘μ λ₯Ό μ΄ν΄νλ €λ©΄ λ¨Όμ λ μ컬 νκ²½, μ¦ λ μ컬 μ€μ½νλ₯Ό μ΄ν΄ν΄μΌ νλ€.
μλ°μ€ν¬λ¦½νΈ μμ§μ ν¨μκ° μ μλ μμΉμ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ νλ€.
μ΄λ₯Ό λ μ컬 μ€μ½ν(μ μ μ€μ½ν)λΌκ³ νλ€.
κ·Έλ¦¬κ³ κ°μ²΄κ° μμ±λλ μμ μ μμ μ€μ½νκ° κ²°μ λλ€.
β‘οΈ [[Envirnment]] λ΄λΆ μ¬λ‘―μ μ μ₯
μ΄ν ν¨μκ° νΈμΆλκ³ ν¨μ λͺΈμ²΄ μ½λκ° νκ°λλ μμ μ μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘°μ
κ°μ²΄κ° μμ±λ λ μ μ₯ν μμ μ€μ½νμ λν μ°Έμ‘°κ°μ μ μ₯νλ€.
02. ν¨μ κ°μ²΄μ λ΄λΆ μ¬λ‘― [[Environment]]
λ μ컬 μ€μ½νκ° κ°λ₯νλ €λ©΄ ν¨μλ μμ μ€μ½νλ₯Ό κΈ°μ΅ν΄μΌνλ€.
(μμ μ€μ½νλ ν¨μ μ μκ° μμΉνλ μ€μ½νμ΄λ€.)
μ΄λ₯Ό μν΄ ν¨μλ ν¨μ μ μκ° νκ°λμ΄ ν¨μ κ°μ²΄λ₯Ό μμ±ν λ,
μμ μ΄ μ μλ νκ²½(μμΉ)μ μν΄ κ²°μ λ μμ μ€μ½νμ μ°Έμ‘°λ₯Ό
ν¨μ κ°μ²΄ μμ μ λ΄λΆ μ¬λ‘― [[Envirnment]]μ μ μ₯νλ€.
β‘οΈ [[Environment]] λ΄λΆ μ¬λ‘―μ μ μ₯λ μμ μ€μ½νμ μ°Έμ‘°λ νμ¬ μ€ν μ€μΈ μ€ν 컨ν μ€νΈμ λ μ컬 νκ²½μ κ°λ¦¬ν¨λ€.
β‘οΈ ν¨μ κ°μ²΄μ [[Environment]] λ΄λΆ μ¬λ‘―μ μ μ₯λ μμ μ€μ½νλ μμ μ΄ νΈμΆλμμ λ μμ±λ ν¨μ λ μ컬 νκ²½μ μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘°μ μ μ₯λ μ°Έμ‘°κ°μ΄λ€.
π₯οΈ μμ μ½λ 24-04
const x = 1;
function foo() {
const x = 10;
bar();
}
// ν¨μ barλ μ μ λ μ컬 νκ²½μ [[Environment]]μ μ μ₯νμ¬ κΈ°μ΅νλ€.
function bar() {
console.log(x);
}
foo(); // 1
bar(); // 10
β‘οΈ κ·Έλ¦Όμ β - μ μ μ½λ νκ° μμ μμ fooμ barν¨μ κ°μ²΄κ° μμ±λλ©°, κ° ν¨μ κ°μ²΄μ λ΄λΆ μ¬λ‘― [[Environment]]μ μμ μ€μ½νκ° μ μ₯λ¨.
β‘οΈ fooν¨μκ° νΈμΆλλ©΄, β‘ fooν¨μμ λ μ컬 νκ²½μ΄ μμ±λλ©°, μΈλΆ λ μ컬 νκ²½ νκ²½μ λν μ°Έμ‘°μ μ μ λ μ컬 νκ²½μ μ°Έμ‘°(ν¨μ κ°μ²΄μ λ΄λΆ μ¬λ‘― [[Environment]]μ μ μ₯λ)κ° μ μ₯λλ€.
β‘οΈ barν¨μκ° νΈμΆλλ©΄ β’ barν¨μμ λ μ컬 νκ²½μ΄ μμ±λλ©°, μΈλΆ λ μ컬 νκ²½ νκ²½μ λν μ°Έμ‘°μ μ μ λ μ컬 νκ²½μ μ°Έμ‘°(ν¨μ κ°μ²΄μ λ΄λΆ μ¬λ‘― [[Environment]]μ μ μ₯λ)κ° μ μ₯λλ€.
03. ν΄λ‘μ μ λ μ컬 νκ²½
π‘ μΈλΆ ν¨μλ³΄λ€ μ€μ²© ν¨μκ° λ μ€λ μ μ§λλ κ²½μ°, μ€μ²© ν¨μλ μ΄λ―Έ μλͺ μ£ΌκΈ°κ° μ’ λ£λ μΈλΆ ν¨μμ λ³μλ₯Ό μ°Έμ‘° κ°λ₯νλ€.
β‘οΈ μ΄λ¬ν μ€μ²© ν¨μλ₯Ό ν΄λ‘μ (closure)λΌκ³ λΆλ₯Έλ€.
π₯οΈ μμ μ½λ 24-05
const x = 1;
// β
function outer() {
const x = 10;
const inner = function () { console.log(x); }; // β‘
return inner;
}
// outer ν¨μλ₯Ό νΈμΆνλ©΄ μ€μ²© ν¨μ innerλ₯Ό λ°ννλ€.
// κ·Έλ¦¬κ³ outer ν¨μμ μ€ν 컨ν
μ€νΈλ μ€ν 컨ν
μ€νΈ μ€νμμ νλμ΄ μ κ±°λλ€.
const innerFunc = outer(); // β’
innerFunc(); // β£ 10
β’μμ outerν¨μλ₯Ό νΈμΆνλ©΄ outerν¨μλ μ€μ²© ν¨μinnerλ₯Ό λ°ν(return)νκ³ μλͺ μ£ΌκΈ°λ₯Ό λ§κ°νλ€.
β‘οΈ μ¦, outerν¨μμ μ€ν 컨ν
μ€νΈλ μ€ν 컨ν
μ€νΈ μ€νμμ μ κ±°λλ€.
β‘οΈ μ΄λ outerν¨μμ μ§μ λ³μ x λν μλͺ
μ£ΌκΈ°λ₯Ό λ§κ°νλ€.
β κ·Έλ¬λ β£μμ innerν¨μ νΈμΆ κ²°κ³Όλ outerν¨μμ μ§μ λ³μ xμ κ°μΈ 10μ΄λ€.
μ΄λ―Έ μλͺ μ£ΌκΈ°κ° μ’ λ£λμ΄ μ€ν 컨ν μ€νΈ μ€νμμ μ κ±°λ outerν¨μμ μ§μ λ³μ xκ° λ€μ λμνλ€.
<μ μ½λ μ€ν μμ>
1. μ μ μ½λ μ€ν (outer κ°μ²΄ μμ±)
2. outer ν¨μ νΈμΆ (inner κ°μ²΄ μμ± λ° λ°ν)
3. innerFunc μ μ λ³μμ inner ν¨μ μ°Έμ‘° ν λΉ
4. innerFuncνΈμΆλ‘ inner ν¨μμ λ μ컬 νκ²½ μμ± (innerν¨μ κ°μ²΄μ [[Environment]] λ΄λΆ μ¬λ‘― μ°Έμ‘°)
β οΈ 2λ²μμ outerν¨μ νΈμΆλκ³ outerν¨μμ μ€νμ΄ μ’ λ£λμ΄ outerν¨μμ μ€ν 컨ν μ€νΈλ μ€ν 컨ν μ€νΈ μ€νμμ μ κ±°λμμ§λ§, outerν¨μμ λ μ컬 νκ²½κΉμ§ μλ©Ένλ κ²μ μλλ€.
β‘οΈ κ°λΉμ§ 컬λ ν°λ μ°Έμ‘°νκ³ μλ λ©λͺ¨λ¦¬ 곡κ°μ ν΄μ νμ§ μλλ°, outer ν¨μμ λ μ컬 νκ²½μ μ°Έμ‘°λκ³ μκΈ° λλ¬Έ.
π‘ ν΄λ‘μ λ μ€μ²© ν¨μκ° μμ μ€μ½νμ μλ³μλ₯Ό μ°Έμ‘°νκ³ μκ³ μ€μ²© ν¨μκ° μΈλΆ ν¨μλ³΄λ€ λ μ€λ μ μ§λλ κ²½μ°μ νμ νλ κ²μ΄ μΌλ°μ μ΄λ€.
04. ν΄λ‘μ μ νμ©
π‘ ν΄λ‘μ λ μν(state)λ₯Ό μμ νκ² λ³κ²½νκ³ μ μ§νκΈ° μν΄ μ¬μ©λλ€.
β‘οΈ μνλ₯Ό μμ νκ² μλ(information hiding)νκ³ νΉμ ν¨μμκ²λ§ μν λ³κ²½μ νμ©νκΈ° μν΄ μ¬μ©λλ€.
π₯οΈ μμ μ½λ 24-09 (num λ³μμ κ°μ μ μ λ³μλ‘ κ΄λ¦¬)
// μΉ΄μ΄νΈ μν λ³μ
let num = 0;
// μΉ΄μ΄νΈ μν λ³κ²½ ν¨μ
const increase = function () {
// μΉ΄μ΄νΈ μνλ₯Ό 1λ§νΌ μ¦κ° μν¨λ€.
return ++num;
};
console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3
β οΈ μ μ½λλ μ€λ₯μ κ°λ₯μ±μ΄ μμ΄ μ’μ§ μμ μ½λλ€.
β‘οΈ num μ μ λ³μμ μΈμ λ μ§ λꡬλ μ κ·Όνμ¬ λ³κ²½μ΄ κ°λ₯νκΈ° λλ¬Έμ΄λ€.
π₯οΈ μμ μ½λ 24-10 (num λ³μμ κ°μ ν¨μμ μ§μ λ³μλ‘ κ΄λ¦¬)
// μΉ΄μ΄νΈ μν λ³κ²½ ν¨μ
const increase = function () {
// μΉ΄μ΄νΈ μν λ³μ
let num = 0;
// μΉ΄μ΄νΈ μνλ₯Ό 1λ§νΌ μ¦κ° μν¨λ€.
return ++num;
};
// μ΄μ μνλ₯Ό μ μ§νμ§ λͺ»νλ€.
console.log(increase()); // 1
console.log(increase()); // 1
console.log(increase()); // 1
β οΈ ν¨μκ° νΈμΆλ λλ§λ€ μ§μ λ³μnumμ λ€μ μ μΈλμ΄ 0μΌλ‘ μ΄κΈ°νλκΈ° λλ¬Έμ μνλ₯Ό μ μ§νμ§ λͺ»νλ€.
π₯οΈ μμ μ½λ 24-11 (ν΄λ‘μ νμ©)
// μΉ΄μ΄νΈ μν λ³κ²½ ν¨μ
const increase = (function () {
// μΉ΄μ΄νΈ μν λ³μ
let num = 0;
// ν΄λ‘μ
return function () {
// μΉ΄μ΄νΈ μνλ₯Ό 1λ§νΌ μ¦κ° μν¨λ€.
return ++num;
};
}());
console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3
β‘οΈ μ½λ μ€λͺ
β ν΄λ‘μ λ‘ numμ μν(state)λ₯Ό μλνμ¬ μλμΉ μκ² λ³κ²½λμ§ μλλ‘ μμ νκ² κ΄λ¦¬νκ³ ,
νΉμ ν¨μμκ²λ§ μν λ³κ²½μ νμ©νμ¬ μνλ₯Ό μμ νκ² λ³κ²½νκ³ μ μ§νλ€.
* π₯οΈ μμ μ½λ 24-12 (ν΄λ‘μ - κ°μ κΈ°λ₯ μΆκ°)
const counter = (function () {
// μΉ΄μ΄νΈ μν λ³μ
let num = 0;
// ν΄λ‘μ μΈ λ©μλλ₯Ό κ°λ κ°μ²΄λ₯Ό λ°ννλ€.
// κ°μ²΄ 리ν°λ΄μ μ€μ½νλ₯Ό λ§λ€μ§ μλλ€.
// λ°λΌμ μλ λ©μλλ€μ μμ μ€μ½νλ μ¦μ μ€ν ν¨μμ λ μ컬 νκ²½μ΄λ€.
return {
// num: 0, // νλ‘νΌν°λ publicνλ―λ‘ μλλμ§ μλλ€.
increase() {
return ++num;
},
decrease() {
return num > 0 ? --num : 0;
}
};
}());
console.log(counter.increase()); // 1
console.log(counter.increase()); // 2
console.log(counter.decrease()); // 1
console.log(counter.decrease()); // 0
* π₯οΈ μμ μ½λ 24-13 (ν΄λ‘μ - μμ±μ ν¨μλ‘ νν)
const Counter = (function () {
// β μΉ΄μ΄νΈ μν λ³μ
let num = 0;
function Counter() {
// this.num = 0; // β‘ νλ‘νΌν°λ publicνλ―λ‘ μλλμ§ μλλ€.
}
Counter.prototype.increase = function () {
return ++num;
};
Counter.prototype.decrease = function () {
return num > 0 ? --num : 0;
};
return Counter;
}());
const counter = new Counter();
console.log(counter.increase()); // 1
console.log(counter.increase()); // 2
console.log(counter.decrease()); // 1
console.log(counter.decrease()); // 0
(μ μμ μ½λ 24-12, 24-13 μμ)increase, decrease λ©μλλ νλ‘ν νμ
λ©μλμ΄λ€.
μ΄ λ©μλλ€μ΄ νκ°λμ΄ ν¨μ κ°μ²΄κ° μμ±λ λ μ€ν μ€μΈ μ€ν 컨ν
μ€νΈλ μ¦μ μ€ν ν¨μμ μ€ν 컨ν
μ€νΈμ΄λ€.
λ°λΌμ increase, decreaseλ©μλλ μ¦μ μ€ν ν¨μμ μ€ν 컨ν μ€νΈμ λ μ컬 νκ²½μ κΈ°μ΅νλ ν΄λ‘μ μ΄λ€.
β λ€μ λ§νλ©΄ numλ³μμ κ°μ increaseμ decreaseλ©μλλ§μ΄ λ³κ²½ν μ μλ€.
05. μΊ‘μνμ μ 보 μλ
π‘ μΊ‘μν(encapsulation) : κ°μ²΄μ μν(state)λ₯Ό λνλ΄λ νλ‘νΌν°μ νλ‘νΌν°λ₯Ό μ°Έμ‘°νκ³ μ‘°μν μ μλ λμμΈ λ©μλλ₯Ό νλλ‘ λ¬Άλ κ²
π‘ μ 보 μλ(information hiding) : μΊ‘μνκ° κ°μ²΄μ νΉμ νλ‘νΌν°λ λ©μλλ₯Ό κ°μΆ λͺ©μ μΌλ‘ μ¬μ©ν λλ₯Ό λ§ν¨.
β οΈ λλΆλΆμ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ° μΈμ΄λ public, private, protectedμ κ°μ μ κ·Ό μ νμ(access modifier)λ₯Ό μ 곡νμ§λ§,
β οΈ μλ°μ€ν¬λ¦½νΈλ μ 곡νμ§ μλλ€. μ¦ λͺ¨λ νλ‘νΌν°μ λ©μλλ publicμ΄λ€. -> μΈλΆμ 곡κ°λμ΄ μλ€.
π₯οΈ μμ μ½λ 24-16 (μΈμ€ν΄μ€ λ©μλμμ μ§μ λ³μ μ°Έμ‘°)
function Person(name, age) {
this.name = name; // public
let _age = age; // private
// μΈμ€ν΄μ€ λ©μλ
this.sayHi = function () {
console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
};
}
const me = new Person('Lee', 20);
me.sayHi(); // Hi! My name is Lee. I am 20.
console.log(me.name); // Lee
console.log(me._age); // undefined
const you = new Person('Kim', 30);
you.sayHi(); // Hi! My name is Kim. I am 30.
console.log(you.name); // Kim
console.log(you._age); // undefined
β‘οΈ _age λ³μ : Person μμ±μ ν¨μμ μ§μ λ³μ
-> private ν¨
π₯οΈ μμ μ½λ 24-17 (-> sayHi λ©μλμ μ€λ³΅ μμ±μ λ°©μ§νκΈ° μν΄, sayHi λ©μλλ₯Ό νλ‘ν νμ λ©μλλ‘ λ³κ²½)
function Person(name, age) {
this.name = name; // public
let _age = age; // private
}
// νλ‘ν νμ
λ©μλ
Person.prototype.sayHi = function () {
// Person μμ±μ ν¨μμ μ§μ λ³μ _ageλ₯Ό μ°Έμ‘°ν μ μλ€
console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
};
β οΈ νλ‘ν νμ λ©μλ(Person.prototype.sayHi λ©μλ) λ΄μμλ Person μμ±μ ν¨μμ μ§μ λ³μμΈ _ageλ₯Ό μ°Έμ‘°ν μ μλ€.
π₯οΈ μμ μ½λ 24-18 (νλ‘ν νμ λ©μλλ₯Ό ν΄λ‘μ λ‘ νμ©)
const Person = (function () {
let _age = 0; // private
// μμ±μ ν¨μ
function Person(name, age) {
this.name = name; // public
_age = age;
}
// νλ‘ν νμ
λ©μλ
Person.prototype.sayHi = function () {
console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
};
// μμ±μ ν¨μλ₯Ό λ°ν
return Person;
}());
const me = new Person('Lee', 20);
me.sayHi(); // Hi! My name is Lee. I am 20.
console.log(me.name); // Lee
console.log(me._age); // undefined
const you = new Person('Kim', 30);
you.sayHi(); // Hi! My name is Kim. I am 30.
console.log(you.name); // Kim
console.log(you._age); // undefined
β‘οΈ μ¦μ μ€ν ν¨μλ‘ κ°μΈμ κ·Έ μμ μ§μ λ³μ _ageλ₯Ό μ μΈνκ³ , Personμμ±μ ν¨μμ Person.protytpe.sayHiλ©μλ(νλ‘ν νμ λ©μλ)λ₯Ό μ μΈνκ³ Personμμ±μ ν¨μλ₯Ό λ°ννλλ‘ νλ€.
β‘οΈ κ·Έλ κ²λλ©΄ μ¦μ μ€ν ν¨μλ μ’ λ£λμμ§λ§ λ°νλ Personμμ±μ ν¨μμ sayHiλ©μλλ μ¬μ ν μ§μ λ³μ_ageλ₯Ό μ°Έμ‘°ν μ μλ ν΄λ‘μ μ΄λ€.
* π₯οΈ μμ μ½λ 24-19
β οΈ Personμμ±μ ν¨μκ° μ¬λ¬ κ°μ μΈμ€ν΄μ€λ₯Ό μμ±ν κ²½μ°, _ageλ³μμ μνκ° μ μ§λμ§ μλλ€.
const me = new Person('Lee', 20);
me.sayHi(); // Hi! My name is Lee. I am 20.
const you = new Person('Kim', 30);
you.sayHi(); // Hi! My name is Kim. I am 30.
// _age λ³μ κ°μ΄ λ³κ²½λλ€!
me.sayHi(); // Hi! My name is Lee. I am 30.
06. μμ£Ό λ°μνλ μ€μ
β οΈ forλ¬Έμ μ¬μ©ν λ forλ¬Έ λ΄λΆμ ν¨μλ₯Ό μ μΈνλ κ²½μ° κΈ°λνμ§ μμ κ²°κ³Όκ° λνλλ€.
π₯οΈ μμ μ½λ 24-20
var funcs = [];
for (var i = 0; i < 3; i++) {
funcs[i] = function () { return i; }; // β
}
for (var j = 0; j < funcs.length; j++) {
console.log(funcs[j]()); // β‘
}
β οΈ 0 1 2κ° μΆλ ₯λ κ²μ κΈ°λνμμ§λ§ 3 3 3μ΄ μΆλ ₯λλ€.
β‘οΈ μ΄μ λ varλ‘ μ μΈλ iλ³μλ μ μ λ³μλ‘ μ μΈλμκΈ° λλ¬Έμ ν¨μ μ μΈλ¬Έμ iκ°μ μ λ¬νμλλΌλ,
νΈμΆνλ μμ μλ iκ°μ΄ 3μ΄κΈ° λλ¬Έμ 3 3 3μ΄ μΆλ ₯λλ€.
π₯οΈ μμ μ½λ 24-21 (ν΄λ‘μ λ₯Ό μ¬μ©ν΄ μ μ ν μ½λ)
var funcs = [];
for (var i = 0; i < 3; i++){
funcs[i] = (function (id) { // β
return function () {
return id;
};
}(i));
}
for (var j = 0; j < funcs.length; j++) {
console.log(funcs[j]());
}
π‘ forλ¬Έ λ΄λΆμ ν¨μλ₯Ό μ μΈν λ μ¦μ μ€ν ν¨μλ‘ κ°μΈκ³ iκ°μ μ λ¬ν΄ μ£Όλλ‘ μμ
β‘οΈ μ΄λ κ² νλ©΄ μλ‘μ΄ ν¨μ λ 벨 μ€μ½νκ° λ°λ³΅λ¬Έμ λ°λ³΅νλ©΄μ κ³μ μ겨 κ°κ°μ μ€μ½νμ iκ°μ΄ id λ§€κ°λ³μμ μ μ₯λκ² λλ€.
* π₯οΈ μμ μ½λ 24-22 (μ μμ λ³΄λ€ λ κ°λ¨ν λ°©λ² - let ν€μλ μ¬μ©)
const funcs = [];
for (let i = 0; i < 3; i++) {
funcs[i] = function () { return i; };
}
for (let i = 0; i < funcs.length; i++) {
console.log(funcs[i]()); // 0 1 2
β‘οΈ let ν€μλλ λΈλ‘ λ 벨 μ€μ½νλ₯Ό λ°λ₯΄κΈ° λλ¬Έμ forλ¬Έμ΄ λ°λ³΅λ λ λ§λ€ μλ‘μ΄ λ μ컬 νκ²½μ΄ μμ±λλ€.
π μ°Έκ³ μλ£