javascript closures by example - Lee-hyuna/33-js-concepts-kr GitHub Wiki

์˜ˆ์ œ๋กœ ์‚ดํŽด๋ณด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํด๋กœ์ €

์›๋ฌธ: JavaScript closures by example

ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์„ ์•Œ๋ฉด ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค. ๋ฌธ์ œ๋Š” ๋งŽ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์ž๊ฐ€ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์„ ๋ชจ๋ฅธ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ฐ€์ด๋“œ๋ฅผ ์ฝ์€ ํ›„ ํด๋กœ์ €๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€, ์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š” ์ง€ ์ž˜ ์ดํ•ดํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

1. ํด๋กœ์ €๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

MDN(Mozilla Developer Network)์— ๋‚˜์™€ ์žˆ๋Š” ํด๋กœ์ €์˜ ์ •์˜๋ฅผ ์ธ์šฉํ•˜์ž๋ฉด, "ํด๋กœ์ €๋Š” ๋…๋ฆฝ์ ์ธ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด ํด๋กœ์ €์— ์ •์˜ ๋œ ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ๋œ ํ™˜๊ฒฝ์„ '๊ธฐ์–ต'ํ•œ๋‹ค." ์•„๋ž˜์˜ ์˜ˆ๋ฅผ ๋ณด์ž.

var outerFunc = function() {
    var message = "Hello, World!";
    var innerFunc = function() {
        return message;
    }
    return innerFunc;
}

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์ฒ˜๋Ÿผ ๋ธ”๋ก ๋ ˆ๋ฒจ ๋ฒ”์œ„ ์ง€์ •(scoping)์ด ์•„๋‹Œ, ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ๋ฒ”์œ„ ์ง€์ •์„ ๊ตฌํ˜„ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ์˜ˆ์—์„œ outerFunc๋‚ด์— ์ •์˜ ๋œ ๋ณ€์ˆ˜ ๋Š” ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„๊ฐ€ ๋กœ์ปฌ์ด๋ฏ€๋กœ ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ๋Š” ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜ ์‹คํ–‰์ด ๋๋‚˜๋ฉด ๋กœ์ปฌ ๋ณ€์ˆ˜๊ฐ€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ outerFunc ํ•จ์ˆ˜๊ฐ€ ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” innerFunc ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ์ฝ”๋“œ๋Š” ํฅ๋ฏธ๋กญ๋‹ค. outerFunc ๊ฐ€ ์‹คํ–‰์„ ๋งˆ์นœ ํ›„์—๋„ message ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ?

> var myFunc = outerFunc();
> myFunc();
'Hello, World!'

message ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณด๋‹ค์‹œํ”ผ, outerFunc๋Š” innerFunc๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  myFunc์— ์ €์žฅํ•œ๋‹ค. myFunc ๋Š” ํด๋กœ์ €๊ฐ€ ๋˜์–ด ์ƒ์„ฑ ๋œ ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, outerFunc ๊ฐ€ ์‹คํ–‰๋  ๋•Œ message ๋ณ€์ˆ˜ ์˜ ๊ฐ’์„ ๊ธฐ์–ตํ•œ๋‹ค . ์ด๋Ÿฐ ๊ด€๊ณ„๋ฅผ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์—์„œ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋‹ˆ ์•Œ์•„๋‘์ž!

2. For loops: ์ผ๋ฐ˜์ ์ธ ์‹ค์ˆ˜

for ๋ฃจํ”„ ๋‚ด์—์„œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝํ—˜์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ๋‚˜์—๊ฒŒ ์ฒ˜์Œ ์ผ์–ด ๋‚ฌ์„ ๋•Œ ๋‚˜๋Š” ๋•Œ๋ ค์น˜์šฐ๊ณ  ์‹ถ์—ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

var names = ['Locke', 'Franklin', 'Smith', 'Mises'];
var logName = function(name) {
    console.log(name);
};
var name;
for (var i=0; i < names.length; i++) {
    name = names[i];
    setTimeout(function(){
        logName(name);
    }, 1000);
}

์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” names ์ด๋ผ๋Š” ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ๋„ค ๊ฐœ์˜ ์ด๋ฆ„ ๋ชฉ๋ก์„ ์ €์žฅํ•œ๋‹ค. name์„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ณ  ๊ธฐ๋กํ•˜๋Š” logName ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ names์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ logName์— name์„ ์ „๋‹ฌํ•˜๊ณ , ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ 1์ดˆ ํ›„์— ์‹คํ–‰ํ•˜๋Š” for loop๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค . ์ด ์˜ˆ์ œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ "Mises"๋ฅผ ๋„ค ๋ฒˆ ๊ธฐ๋กํ•œ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค. logName์€ ์ž‘์„ฑ๋œ ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €์ด๋‹ค. for ๋ฃจํ”„์—์„œ logName ๋ฐ”๋กœ ํ˜ธ์ถœ ํ•œ ๊ฒฝ์šฐ์—” ๋ชจ๋“  name์„ ๊ธฐ๋กํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๋Œ€์‹  ํƒ€์ž„ ์•„์›ƒ์„ ์„ค์ •ํ•˜๊ณ  ํด๋กœ์ €(setTimeout์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ)๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์œผ๋ฉฐ, ์ด ํด๋กœ์ €๋Š” ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋‹ค. 1์ดˆ๊ฐ€ ์ง€๋‚œ ๋’ค, name ๋ณ€์ˆ˜๊ฐ€ "Mises"๋กœ ์„ค์ •๋˜์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹จ์ˆœํžˆ "Mises"๋ฅผ ๋„ค ๋ฒˆ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ํด๋กœ์ €๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

var names = ['Locke', 'Franklin', 'Smith', 'Mises'];
var logName = function(name) {
    console.log(name);
};
var makeClosure = function(name) {
    return function() {
        logName(name);
    }
};
for (var i=0; i < names.length; i++) {
    var name = names[i];
    setTimeout(makeClosure(name), 1000);
}

๊ทธ๋Ÿฌ๋‚˜ ๋ถˆํ•„์š”ํ•œ ํด๋กœ์ €๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค. ์‚ฌ์‹ค, ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ํ›จ์”ฌ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ for loop์˜ ํด๋กœ์ € ๋ฌธ์ œ์™€ ํด๋กœ์ €๋กœ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด 1 ์ดˆ ์ง€์—ฐ ํ›„ 4 ๊ฐœ์˜ name์ด ๊ฐ๊ฐ์ด ๊ธฐ๋ก๋˜์–ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ name ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ ๋  ๋•Œ๋ถ€ํ„ฐ '๊ธฐ์–ตํ•˜๋Š”' ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜ ํ•˜๋Š” makeClosure ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์—ˆ๋‹ค. ํด๋กœ์ €๋Š” ์ฆ‰์‹œ ๋งŒ๋“ค์–ด ์ง€๋ฏ€๋กœ ๊ฐ name ์˜ ๊ฐ€์น˜๋ฅผ ๊ธฐ์–ตํ•œ๋‹ค.

3. ๋ชจ๋“ˆ ํŒจํ„ด

๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํด๋กœ์ €์— ๊ธฐ๋ฐ˜ํ•œ ๋ชจ๋“ˆ ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋งํฌ์—์„  ๋ชจ๋“ˆ ํŒจํ„ด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ๊ธฐ์„  ๊ธฐ๋ณธ๊ณผ ํด๋กœ์ €๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ ์ž ํ•œ๋‹ค. ๋ชจ๋“ˆ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ ์€ ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•˜๊ณ , ๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉฐ, ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” private ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ชจ๋“ˆ ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

var module = (function(){
    var localVar = 1913;
    var localFunc = function() {
        return localVar;
    }
    var otherLocalFunc = function(num) {
        localVar = num;
    }
    return {
        getVar: localFunc,
        setVar: otherLocalFunc
    }
})();

์œ„ ์˜ˆ์ œ์—์„œ ์ต๋ช… ํ•จ์ˆ˜ ์•ˆ์— ๋‹จ์ผ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด ํ™˜๊ฒฝ์—๋Š” ๋กœ์ปฌ ๋ณ€์ˆ˜ localVar ๋ฐ ๋กœ์ปฌ ํ•จ์ˆ˜ ํ‘œํ˜„์‹ localFunc๊ฐ€ ํฌํ•จ ๋œ๋‹ค. ์ด ๋ณ€์ˆ˜ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์ต๋ช… ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ „์—ญ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ต๋ช… ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์ต๋ช… ํ•จ์ˆ˜์— ์˜ํ•ด ๋ฐ˜ํ™˜๋˜์–ด์•ผํ•œ๋‹ค. ์œ„ ์˜ˆ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด, localFunc์„ ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š”getVar๋ผ๋Š” key์™€, otherLocalFunc๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š” setVar ๋ผ๋Š” key ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ํŒจํ„ด์— ๋Œ€ํ•œ ์ข‹์€ ์ ์€ ๋ชจ๋“ˆ์˜ state๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜๋ช… ๋™์•ˆ ์ง€์†๋œ๋‹ค. ์ด๊ฒƒ์€ localVar๋ฅผ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์ง€๋งŒ, ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜๋Š” ์—ฌ์ „ํžˆ์ด ๋ณ€์ˆ˜์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋ผ.

console.log(module.getVar());
> 1913
module.setVar(1776);
console.log(module.getVar());
> 1776

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ private ๋ณ€์ˆ˜ localVar๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์—๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ณ , ์ „์—ญ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€ํ–ˆ๋‹ค . ์—ฌ๊ธฐ์„œ ์œ ์ผํ•œ ์ „์—ญ ๋ณ€์ˆ˜๋Š” module ์ด๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์„ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์ด ๊ธ€์˜ ๋ฒ”์œ„์— ํฌํ•จ๋˜์ง€๋Š” ์•Š์ง€๋งŒ ์ด ํŒจํ„ด์€ IIFE (์ฆ‰์‹œ ํ˜ธ์ถœ ํ•จ์ˆ˜ ํ‘œํ˜„์‹)๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ต๋ช… ํ•จ์ˆ˜๊ฐ€ (function () {...}) () ๊ณผ ๊ฐ™์ด ๊ด„ํ˜ธ๋กœ ๋ฌถ์—ฌ ์žˆ์Œ์„ ๋ณผ ์ˆ˜์žˆ๋‹ค. ๊ด„ํ˜ธ๊ฐ€ ์—†์œผ๋ฉด ์ด๊ฒƒ์€ ๋‹จ์ˆœํžˆ ํ•จ์ˆ˜ ์ •์˜ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ด„ํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด (๋’ค์— ๋‚˜์˜ค๋Š” ๊ด„ํ˜ธ์—๋„ ์œ ์˜) ์ฆ‰์‹œ ํ˜ธ์ถœ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด ๋œ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ ํ•˜๋ผ.

4. ๋˜๋‹ค๋ฅธ ์˜ˆ์ œ

์ข€ ๋” ์‹ค์šฉ์ ์ธ ์˜ˆ๊ฐ€ ์žˆ๋‹ค. ์ฆ‰์„์—์„œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ํ•จ์ˆ˜ ํŒฉํ† ๋ฆฌ(ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜)๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜ ํŒฉํ† ๋ฆฌ์˜ ๊ฒฐ๊ณผ ํ•จ์ˆ˜๋Š” ์ž‘์„ฑ๋œ ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ € ์ด๋‹ค.

var functionFactory = function(num1) {
    return function(num2) {
        return num1 * num2;
    }
}

์œ„์˜ functionFactory ํ•จ์ˆ˜์— ํ•˜๋‚˜์˜ ์ˆซ์ž๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ functionFactory๋Š” ์›๋ž˜ ์ „๋‹ฌ ๋œ num1 ๊ฐ’์„ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค . ๊ฒฐ๊ณผ ํ•จ์ˆ˜๋Š” ๊ธฐ์กด num1์— ํด๋กœ์ € ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌ ๋œ num2 ๊ฐ’์„ ๊ณฑํ•œ๋‹ค .

var mult5 = functionFactory(5);
var mult10 = functionFactory(10);

์œ„์˜ ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ mult5 ๋ฐ mult10์„ ๋งŒ๋“ ๋‹ค . ์ด์ œ 5 ๋˜๋Š” 10์„ ๊ณฑํ•˜๋ ค๋Š” ์ˆซ์ž๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ œ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ƒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

> mult5(3)
15
> mult5(5)
25
> mult10(3)
30
> mult10(5)
50

์ด ๊ฐ€์ด๋“œ๊ฐ€ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์•„๋ž˜์— ์•Œ๋ ค์ฃผ๊ธฐ ๋ฐ”๋ž€๋‹ค. ๋˜ํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌ ํ•˜๊ฑฐ๋‚˜ ๋” ๋…ํŠนํ•œ ์˜ˆ์ œ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์˜๊ฒฌ์„ ๋ณด๋‚ด์ฃผ๊ธฐ ๋ฐ”๋ž€๋‹ค.