ν¨μν νλ‘κ·Έλλ°, μ 'ν¨μμ§ν₯ν'μ΄ μλκΉ?
κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ 'Object-Oriented Programming'μ λ²μμ΄λ€. μ¬κΈ°μ 'Oriented'κ° 'μ§ν₯'μΌλ‘ λ²μλμ΄ μ°λ¦¬λ 'κ°μ²΄μ§ν₯'μ΄λΌ λΆλ₯Έλ€. κ·Έλ°λ° 'Functional Programming'μ μ 'ν¨μμ§ν₯ν'μ΄ μλ 'ν¨μν'μΌκΉ?
κ°μκΈ° λ μλ¬ΈμΈλ°, μ²μμλ λ¨μν λ²μμ μ°¨μ΄λΌκ³ μκ°νλ€. νμ§λ§ μ΄λ₯Ό μ°Ύμ보면μ ν₯λ―Έλ‘μ΄ λ΄μ©λ€μ λ°κ²¬ν μ μμλ€.
μ°¨μ΄μ
- 'μ§ν₯'μ μλ―Έ
- 'μ§ν₯(ζε)'μ "μ΄λ€ λͺ©νλ‘ λ»μ΄λ λ°©ν₯μ ν₯ν¨"μ μλ―Ένλ€.
- κ°μ²΄μ§ν₯μ νλ‘κ·Έλλ°μ μ€μ¬μ 'κ°μ²΄'μ λκ³ , μ΄λ₯Ό ν₯ν΄ λμκ°λ λ°©λ²λ‘ μ΄λ€.
- 'ν'μ μλ―Έ
- 'ν(ε)'μ "μκΉμλ λͺ¨μ"μ μλ―Ένλ€.
- ν¨μνμ μνμ ν¨μλ₯Ό λ°νμΌλ‘ ν νλ‘κ·Έλλ°μ ν 'νν'λ₯Ό λνλΈλ€.
μμ ν¨μλ?
ν¨μν νλ‘κ·Έλλ°μμ κ°μ₯ μ€μν κ°λ μ€ νλκ° λ°λ‘ 'μμ ν¨μ(Pure Function)'λ€. μμ ν¨μλ λ€μκ³Ό κ°μ νΉμ§μ κ°μ§λ€:
- κ°μ μ λ ₯μ λν΄ νμ κ°μ μΆλ ₯μ λ°ννλ€.
- μΈλΆ μνλ₯Ό λ³κ²½νμ§ μλλ€. (λΆμ ν¨κ³Όκ° μμ)
μλ₯Ό λ€μ΄λ³΄μ:
// μμ ν¨μμ μ
function add(a, b) {
return a + b;
}
// μμ ν¨μκ° μλ μ
let total = 0;
function addToTotal(a) {
total += a; // μΈλΆ λ³μλ₯Ό λ³κ²½ν¨
return total;
}
add
ν¨μλ μμ ν¨μλ€. μ
λ ₯κ° a
μ b
κ° κ°λ€λ©΄ νμ κ°μ κ²°κ³Όλ₯Ό λ°ννλ€.
λ°λ©΄ addToTotal
ν¨μλ μΈλΆ λ³μ total
μ λ³κ²½νλ―λ‘ μμ ν¨μκ° μλλ€.
κ°μ²΄μ§ν₯ vs ν¨μν
κ°μ κΈ°λ₯μ ꡬνν λ λ ν¨λ¬λ€μμ μ΄λ»κ² λ€λ₯Έμ§ κ°λ¨ν μ₯λ°κ΅¬λ κ³μ° μμλ₯Ό ν΅ν΄ μ΄ν΄λ³΄μ:
// κ°μ²΄μ§ν₯μ μ κ·Ό
class ShoppingCart {
constructor() {
this.items = [];
}
addItem(item) {
this.items.push(item);
}
calculateTotal() {
return this.items.reduce((sum, item) => sum + item.price, 0);
}
applyDiscount(discount) {
this.items.forEach(item => {
item.price = item.price * (1 - discount);
});
}
}
// μ¬μ© μμ
const cart = new ShoppingCart();
cart.addItem({ name: "μ±
", price: 15000 });
cart.applyDiscount(0.1);
console.log(cart.calculateTotal());
// ν¨μν μ κ·Ό
const addItem = (cart, item) => [...cart, item];
const calculateTotal = (items) =>
items.reduce((sum, item) => sum + item.price, 0);
const applyDiscount = (items, discount) =>
items.map(item => ({
...item,
price: item.price * (1 - discount)
}));
// μ¬μ© μμ
let items = [];
items = addItem(items, { name: "μ±
", price: 15000 });
const discountedItems = applyDiscount(items, 0.1);
console.log(calculateTotal(discountedItems));
μ μ½λμμ λ³Ό μ μλ―μ΄
- κ°μ²΄μ§ν₯μμλ μ₯λ°κ΅¬λλΌλ 'κ°μ²΄'κ° μνλ₯Ό κ°μ§κ³ , κ·Έ μνλ₯Ό λ³κ²½νλ λ©μλλ€μ κ°μ§λ€.
- ν¨μνμμλ μμ ν¨μλ€μ΄ λΆλ³μ±(immutability)μ μ§ν€λ©° μλ‘μ΄ κ°μ λ°ννλ€.
μ 'ν¨μν'μΌκΉ?
μ΄λ λ¨μν λ²μμ μ°¨μ΄κ° μλμλ€. ν¨μν νλ‘κ·Έλλ°μ λ³Έμ§μ μΈ νΉμ±κ³Ό κ΄λ ¨μ΄ μμλ€.
- μνμ ν¨μμ νΉμ± λ°μ
- ν¨μν νλ‘κ·Έλλ°μ μνμ ν¨μ κ°λ μ κ·Έλλ‘ μ°¨μ©νλ€.
- μ λ ₯μ΄ κ°μΌλ©΄ νμ κ°μ μΆλ ₯μ΄ λμ€λ μμν¨μμ νΉμ±μ λ°μνλ€.
- νλ‘κ·Έλλ° ν¨λ¬λ€μμ λ³Έμ§
- κ°μ²΄μ§ν₯μ κ°μ²΄λ₯Ό μ€μ¬μΌλ‘ 'μ§ν₯'νλ λ°©λ²λ‘ μ΄λ€.
- λ°λ©΄ ν¨μνμ νλ‘κ·Έλ¨ μμ²΄κ° ν¨μλ€μ μ§ν©μ΄λΌλ ννλ₯Ό λλ€.
etc
ν¨μν νλ‘κ·Έλλ°μ μμ¬λ κ°μ²΄μ§ν₯λ³΄λ€ λ μ€λλμλ€κ³ νλ€.
1950λ
λ LISPλΌλ μΈμ΄λΆν° μμλ ν¨μν νλ‘κ·Έλλ°μ, μνμ νν(mathematical form)λ₯Ό κ·Έλλ‘ νλ‘κ·Έλλ°μ μ μ©νλ € νλ μλμλ€.
μ΄ κΈμ 곡λΆνλ©΄μ μ΄ν΄ν λ΄μ©μ μ 리ν κ²μΌλ‘, λ μ νν λ΄μ©μ΄λ λ€λ₯Έ μκ²¬μ΄ μλ€λ©΄ λκΈλ‘ μλ €μ£ΌμΈμ.
'λμ λμ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
React Nativeλ‘ 8κ°μ λκ² νλ‘μ νΈλ₯Ό ν΅ν΄ μ¬μ©ν΄λ³Έ νκ³ λκΉ..? (0) | 2023.10.10 |
---|---|
[νλ‘μ νΈ νκ³ ] ν μ€νΈ (0) | 2023.09.25 |
SLASH 22 - Effective Component μ§μ κ°λ₯ν μ±μ₯κ³Ό μ»΄ν¬λνΈ (0) | 2022.11.01 |
[λΌμ΄μ§μΊ ν] μΉλ¦¬λ νΈλ μλ£ νκΈ° (7) | 2021.09.18 |
λ΄κ° λ³΄λ €κ³ μ λ Visual Studio Code λ¨μΆν€ λͺ¨μ (μμ μ λ) (0) | 2021.02.10 |