javascript/DeepDive

[Js λ”₯λ‹€μ΄λΈŒ] 12. ν•¨μˆ˜ (2)

hw.kr 2022. 11. 6. 18:15

3. ν•¨μˆ˜ 호좜

 

πŸ“Œ λ§€κ°œλ³€μˆ˜μ™€ 인수

 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 동적 νƒ€μž… 언어이기 λ•Œλ¬Έμ—, ν•¨μˆ˜λ₯Ό μ •μ˜ν• λ•Œ μ‚¬μš©ν•˜λŠ” λ§€κ°œλ³€μˆ˜μ™€ ν˜ΈμΆœν•  λ•Œ μ‚¬μš©ν•˜λŠ” 인수의 νƒ€μž…κ³Ό κ°―μˆ˜μ— μ œν•œμ΄ μ—†λ‹€. 

 

인수의 κ°―μˆ˜κ°€ λ§€κ°œλ³€μˆ˜μ˜ κ°―μˆ˜λ³΄λ‹€ λ§Žκ±°λ‚˜ 적더라도 μ—λŸ¬λŠ” λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

 

function add(x, y){
    return x + y;
}

console.log(add(2, 4)); // 6 

// μΈμˆ˜κ°€ λΆ€μ‘±ν•œ 경우 λ§€κ°œλ³€μˆ˜ y에 ν• λ‹Ήλœ 값이 μ—†μœΌλ―€λ‘œ undefined
console.log(add(2)); // NaN

// 초과된 μΈμˆ˜λŠ” arguments 객체에 λ³΄μ‘΄λœλ‹€
console.log(add(2, 4, 10)); // 6

 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 동적 νƒ€μž… 언어이기 λ•Œλ¬Έμ—, ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” μ‹œμ μ— λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ κ²°μ •ν•  수 μ—†λ‹€.

λ”°λΌμ„œ ν•¨μˆ˜λ₯Ό λ§Œλ“  μ˜λ„μ™€λŠ” λ‹€λ₯Έ νƒ€μž…μ˜ 인수λ₯Ό μ‚¬μš©ν•΄μ„œ 호좜 ν•˜λ”λΌλ„, μ—λŸ¬ 없이 ν•¨μˆ˜κ°€ μ‹€ν–‰λœλ‹€.

λΆ€μ μ ˆν•œ ν˜ΈμΆœμ„ 사전에 미리 λ°©μ§€ν•  수 μ—†λŠ” 문제점이 λ°œμƒν•œλ‹€.

 

πŸ“Œ 인수의 νƒ€μž… ν™•μΈν•˜κΈ°

 

function add(x, y){
    if(typeof x !== 'number' || typeof y !== 'number'){
        throw new Error("μΈμˆ˜λŠ” 숫자 ν˜•νƒœμ˜ 값이여야 ν•©λ‹ˆλ‹€.")
    }

    return x + y;
}

console.log(add(2));
console.log(add('a','b'))

 

μ΄λ ‡κ²Œ ν•¨μˆ˜λ‚΄λΆ€μ—μ„œ 인수둜 μ „λ‹¬λ˜λŠ” κ°’μ˜ νƒ€μž…μ„ ν™•μΈν•˜λ”λΌλ„, 일단 ν˜ΈμΆœμ€ λœλ‹€.

μ •μ νƒ€μž…μ„ μ‚¬μš©ν•  수 μžˆλŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ—μ„œλŠ” μ΄λŸ¬ν•œ λ¬Έμ œμ λ“€μ„ ν•΄κ²°ν•  수 μžˆλ‹€.

 

πŸ“Œ λ§€κ°œλ³€μˆ˜μ™€ 인수의 μ˜ˆμ™Έ μ²˜λ¦¬ν•˜κΈ°

 

// es5 function
function add(x, y){
// x κ°€ μ „λ‹¬λ˜μ§€ μ•ŠμœΌλ©΄, undefined 둜 μ΄ˆκΈ°ν™” 되고 undefined || 0 은 단좕평가에 μ˜ν•΄μ„œ 0 이 λœλ‹€.
    x = x || 0;
    y = y || 0;
    return x + y;
}
console.log(add(2)) // 2

// es6 function
function add(x = 0, y = 0){
    return x + y;
}
console.log(add(2)) // 2

// λ§€κ°œλ³€μˆ˜μ— 인수λ₯Ό μ „λ‹¬ν•˜μ§€ μ•Šμ€ 경우
function add(x, y){
    return x + y;
}
console.log(add(2)) // y λŠ” undefined 둜 할당됨. 2 + undefined = NaN

 

πŸ“Œ λ°˜ν™˜λ¬Έ

 

ν•¨μˆ˜ ν˜ΈμΆœμ€ ν‘œν˜„μ‹μ΄λ‹€, 즉 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ κ°’μœΌλ‘œ ν‰κ°€λ˜λŠ” κ²°κ³Όκ°€ λ‚˜μ™€μ•Ό ν•˜λŠ”λ° μ΄λ•Œ return ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ 평가 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•΄μ€€λ‹€

 

  • return λ°˜ν™˜λ¬Έ 이후에 λ‹€λ₯Έ 문이 μžˆμ–΄λ„ μ‹€ν–‰ν•˜μ§€ μ•Šκ³  λ¬΄μ‹œν•˜κ³  ν•¨μˆ˜λ₯Ό μ’…λ£Œν•œλ‹€
  • λ°˜ν™˜λ¬Έμ€ μƒλž΅ν•  수 있고, μ΄λ•Œ μ•”λ¬΅μ μœΌλ‘œ undefined λ₯Ό λ°˜ν™˜ν•œλ‹€
  • λ°˜ν™˜λ¬Έμ—μ„œ μ€„λ°”κΏˆμ„ ν•΄μ„œλŠ” μ•ˆλœλ‹€

 

4. 참쑰에 μ˜ν•œ 전달과 μ™ΈλΆ€ μƒνƒœ λ³€κ²½

 

λ§€κ°œλ³€μˆ˜λ„ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λ³€μˆ˜μ™€ λ™μΌν•˜κ²Œ μ·¨κΈ‰λ˜λ―€λ‘œ λ§€κ°œλ³€μˆ˜μ— νƒ€μž…μ— λ”°λΌμ„œ κ°’μ—μ˜ν•œ 전달, 참쑰에 μ˜ν•œ μ „λ‹¬λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

 

var user = {
    id : "woong",
}

var age = 24;

function changeValue(primitive, obj){
    primitive += 10;
    obj.id = 'hyun'
    console.log(primitive); // 34
}

changeValue(age, user)

console.log(age); // 24
console.log(user.id); // hyun

 

  • μ›μ‹œ νƒ€μž…μ˜ 값은 λ§€κ°œλ³€μˆ˜λ‘œ 전달 되면, κ°’ μžμ²΄κ°€ λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλŠ” 변경이 κ°€λŠ₯ν•˜μ§€λ§Œ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λ˜λŠ” 인수 νƒ€μž…μ˜ 값이 μ‹€μ œλ‘œ μ €μž₯λ˜μ–΄ μžˆλŠ” λ©”λͺ¨λ¦¬ μƒμ˜ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•  수 μ—†κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ 외뢀에 μžˆλŠ” 원본 값은 λ³€κ²½ν•  수 μ—†λ‹€.

 

  • 객체 νƒ€μž…μ˜ 값은 λ§€κ°œλ³€μˆ˜λ‘œ 전달 되면, μ°Έμ‘° 값이 μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ 외뢀에 μžˆλŠ” 객체에 직접 접근이 κ°€λŠ₯ν•˜λ‹€. λ”°λΌμ„œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 원본 값을 λ³€κ²½ν•˜λ©΄ ν•¨μˆ˜ 외뢀에 μžˆλŠ” 원본 객체의 값도 λ³€κ²½λœλ‹€.

 

🧐 ν”„λ‘œκ·Έλž¨μ˜ 크기가 μ»€μ Έμ„œ A λΌλŠ” 객체λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›λŠ” ν•¨μˆ˜κ°€ μ—¬λŸ¬κ°œμΈ 경우

 

μ–΄λ–€ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 객체의 μƒνƒœκ°€ λ³€κ²½λœλ‹€λ©΄ 이 객체λ₯Ό μ°Έμ‘°ν•˜κ³  μžˆλŠ” λͺ¨λ“  ν•¨μˆ˜μ™€ λ³€μˆ˜λ“€μ˜ μƒνƒœκ°€ λͺ¨λ‘ λ³€κ²½λœλ‹€. ν•¨μˆ˜κ°€ λ§Žμ€ κ²½μš°μ— μ–΄λ–€ ν•¨μˆ˜μ—μ„œ 변경을 ν–ˆλŠ”μ§€ μΆ”μ ν•˜κΈ°λ„ νž˜λ“€κ³  λŒ€μ‘ν•˜κΈ°λ„ νž˜λ“€μ–΄μ§„λ‹€. 이 κ²½μš°λŠ” μ—λŸ¬λ₯Ό λ°œμƒ μ‹œν‚¬ κ°€λŠ₯성이 ꡉμž₯히 λ†’λ‹€.

 

객체λ₯Ό μ›μ‹œ κ°’ 처럼 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ λΆˆλ³€ 객체둜 μƒμ„±ν•΄μ„œ λ³€μˆ˜ 값을 μž¬ν• λ‹Ή ν•΄μ€€ 것 처럼, κΉŠμ€ 볡사λ₯Ό ν†΅ν•΄μ„œ μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜κ³  μž¬ν• λ‹Ήμ„ ν•΄μ£Όμ–΄μ„œ ν•΄κ²°ν•  수 μžˆλ‹€.

또, μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  μ˜μ‘΄ν•˜μ§€λ„ μ•ŠλŠ” 순수 ν•¨μˆ˜λ‘œ ν”„λ‘œκ·Έλž¨μ„ 짜면 였λ₯˜κ°€ λ°œμƒν•  κ°€λŠ₯성을 봉쇄할 수 μžˆλ‹€. 이 방법을 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄λΌ ν•œλ‹€.

 

5. λ‹€μ–‘ν•œ ν•¨μˆ˜μ˜ ν˜•νƒœ

 

1️⃣ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜

 

(function (){
    var a = 2;
    var b = 2;
    console.log(a + b);
}());

// 일반 ν•¨μˆ˜μ²˜λŸΌ 값을 λ°˜ν™˜ν•˜κ³ , λ§€κ°œλ³€μˆ˜λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.
var res = (function (x, y){
    return x + y
}(2, 4));

console.log(res)

 

🧐 κ·Έλ£Ή μ—°μ‚°μž () 둜 ν•¨μˆ˜λ₯Ό λ¬ΆλŠ” μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒ?

 

ν•¨μˆ˜ 객체λ₯Ό λ°”λ‘œ μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œ κ·Έλ£Ή μ—°μ‚°μžλ‘œ λ¬Άμ–΄μ€€λ‹€.

κ·Έλ£Ή μ—°μ‚°μž μ•ˆμ— 있으면 ν”Όμ—°μ‚°μžλ‘œ ν•΄μ„λ˜κ³ , ν”Όμ—°μ‚°μžλŠ” 값을 κ°€μ§„λ‹€.

λ”°λΌμ„œ ν•¨μˆ˜λ₯Ό κ·Έλ£Ή μ—°μ‚°μžλ‘œ 묢으면 ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체λ₯Ό λ°”λ‘œ μƒμ„±ν•˜κ²Œ λœλ‹€.

ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•˜λ©΄ κ·Έ 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” μ‹λ³„μžκ°€ 생긴 것이닀. κ·Έ μ‹λ³„μžλ₯Ό λ°”λ‘œ ν˜ΈμΆœν•΄μ„œ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ ν•  수 μžˆλŠ” 것이닀!

 

λ‚˜λ¨Έμ§€ ν•¨μˆ˜ ν˜•νƒœλ“€μ€ ν΄λ‘œμ € κ°œλ…μ΄ ν•„μš”ν•˜λ‹€. ν΄λ‘œμ € ν•™μŠ΅ ν›„ 정리해야겠닀!