Jieunny์˜ ๋ธ”๋กœ๊ทธ

Unit 9. [JS]ํด๋กœ์ € ๋ณธ๋ฌธ

CodeStates/learning contents

Unit 9. [JS]ํด๋กœ์ €

Jieunny 2022. 12. 23. 09:49

๐Ÿ“ฃ  ํด๋กœ์ € ํ•จ์ˆ˜

โœ”๏ธ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜

const add = (x, y) => x + y;
add(5, 7)	// 12

 

โœ”๏ธ ํ™”์‚ดํ‘œ๋ฅผ ๋‘ ๋ฒˆ ์‚ฌ์šฉ

const adder = x => y => x + y;
adder(5)(7);	// 12

typeof adder(5)	// 'function'

adder(5)	//	y => x + y ์–˜ ์ž์ฒด๊ฐ€ ๋ฆฌํ„ด๊ฐ’์ž„.
ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ๋‘ ๋ฒˆ ๋ฐœ์ƒํ•œ๋‹ค. 
adder(5)์˜ ๋ฆฌํ„ด ๊ฐ’์ด ํ•จ์ˆ˜์ž„์„ ์˜๋ฏธ -> (y => x + y) ์ž์ฒด๊ฐ€ adder(5)์˜ ๋ฆฌํ„ด๊ฐ’์ด๋‹ค.

 

โœ”๏ธ ํด๋กœ์ € ํ•จ์ˆ˜์˜ ๊ธฐ๋ณธ ํ˜•ํƒœ

const adder = function(x) {
	return function(y) {
    		return x + y;
    	}
}
1๏ธโƒฃ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
2๏ธโƒฃ ํด๋กœ์ €์˜ ํ•ต์‹ฌ์€ '์Šค์ฝ”ํ”„๋ฅผ ์ด์šฉํ•ด์„œ ๋ณ€์ˆ˜์˜ ์ ‘๊ทผ์„ ๋‹ซ๋Š”(closure) ๋ฐ'์— ์žˆ๋‹ค.
โžฐ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์— ์˜ํ•ด ์Šค์ฝ”ํ”„๊ฐ€ ๊ตฌ๋ถ„๋œ๋‹ค.
โžฐ ์œ„ ์˜ˆ์‹œ์—์„œ x๊ฐ€ ์„ ์–ธ๋œ ํ•จ์ˆ˜๋Š” '์™ธ๋ถ€ ํ•จ์ˆ˜', y๊ฐ€ ์„ ์–ธ๋œ ํ•จ์ˆ˜๋Š” '๋‚ด๋ถ€ ํ•จ์ˆ˜'๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
=> ์ด ํด๋กœ์ € ํ•จ์ˆ˜๋Š” ์Šค์ฝ”ํ”„๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ.
๐Ÿšจ ๋‚ด๋ถ€ ํ•จ์ˆ˜์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
๐Ÿšจ 3๏ธโƒฃ ์™ธ๋ถ€ ํ•จ์ˆ˜์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“ฃ  ํด๋กœ์ €์˜ ํ™œ์šฉ

โœ”๏ธ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ๋๋‚˜๋”๋ผ๋„, ์™ธ๋ถ€ ํ•จ์ˆ˜ ๋‚ด ๋ณ€์ˆ˜๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์ €์žฅ๋œ๋‹ค.

const adder = function(x) {
	return function(y) {
    		return x + y;
    	}
}
const add5 = adder(5);	// y => x + y ์—ฌ๊ธฐ์„œ x์— 5๋ผ๋Š” ๊ฐ’์ด ๋‹ด๊ฒจ์žˆ์Œ.
add5(7)	// 12	y์— 7์ด๋ผ๋Š” ๊ฐ’์„ ๋„ฃ์Œ.
add5(10)	// 15
๋ณ€์ˆ˜ add5 ์—๋Š” ํด๋กœ์ €๋ฅผ ํ†ตํ•ด ๋ฆฌํ„ดํ•œ ํ•จ์ˆ˜๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋‹ค.
add5 ๋Š” adder ํ•จ์ˆ˜์—์„œ ์ธ์ž๋กœ ๋„˜๊ธด 5๋ผ๋Š” ๊ฐ’์„ x ๋ณ€์ˆ˜์— ๊ณ„์† ๋‹ด๊ณ ์žˆ๋‹ค. (์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ๋๋‚ฌ๋Š”๋ฐ๋„)
์™ธ๋ถ€ ํ•จ์ˆ˜ ์‹คํ–‰์€ ์ด๋ฏธ ๋๋‚ฌ์ง€๋งŒ, add5(7) ์ฒ˜๋Ÿผ x=5 ๋ผ๋Š” ๊ฐ’์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

โœ”๏ธ ํด๋กœ์ €๋กœ HTML ๋ฌธ์ž์—ด ๋งŒ๋“ค๊ธฐ

const tagMaker = tag => content => `<${tag}>${content}</${tag}>`

const divMaker = tagMaker('div');
divMaker('hello');	// '<div>hello</div>' ์™ธ๋ถ€ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋„ tag๋Š” ๊ณ„์† div๋ฅผ ๋‹ด๊ณ  ์žˆ๊ณ  ์‚ฌ์šฉ๊ฐ€๋Šฅํ•จ.
divMaker('codestates');	// '<div>codestates</div>'

const anchoMaker = tagMaker('a');
anchoMaker('go');	// '<a>go</a>'
anchorMaker('urclass');	// '<a>urclass</a>'
ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์Šค์ฝ”ํ”„ ์•ˆ์— ๊ฐ€๋‘์–ด ๋‘” ์ฑ„๋กœ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

 

โœ”๏ธ ํด๋กœ์ € ๋ชจ๋“ˆ ํŒจํ„ด

โœ”๏ธ ๋ชจ๋“ˆํ™” : ํ•จ์ˆ˜์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜์—ฌ ํ•จ์ˆ˜ ํ•˜๋‚˜๋ฅผ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ธ ๋ถ€ํ’ˆ ํ˜•ํƒœ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ.

const makeCounter = () => {
	let value = 0;
    
    return {
    	increase: () => {
        	value = value + 1
        },
        decrease: () => {
       		value = value - 1
        },
        getValue: () => value
        }
    }
    const counter1 = makeCounter();
    
    counter1.increase();
    counter1.decrease();
    counter1.getValue();	// 0
    
    const counter2 = makeCounter();
    counter2.decrease();
    counter2.decrease();
    counter2.getValue();	// -2
๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ๊ฐ์ฒด์— ๋‹ด์•„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค.
counter1 ์€ { increase: f, decrease: f, getValue: f } ๊ฐ์ฒด์ด๋‹ค.

๐Ÿšจ ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ value ๋Š” ์ง์ ‘ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅ ํ•˜๋‹ค -> ์™ธ๋ถ€ ์Šค์ฝ”ํ”„์—์„œ๋Š” ๋‚ด๋ถ€ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ
โžฐ ๋Œ€์‹ , ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด value ๊ฐ’์„ ๊ฐ„์ ‘์ ์œผ๋กœ ์กฐ์ž‘ ํ•  ์ˆ˜ ์žˆ๋‹ค. -> ์ •๋ณด์˜ ์ ‘๊ทผ ์ œํ•œ(์บก์Šํ™”)

๋งŒ์•ฝ ์Šค์ฝ”ํ”„๋กœ value๋ฅผ ๊ฐ์‹ธ์ง€ ์•Š์•˜๋‹ค๋ฉด value๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋Š” value์˜ ๊ฐ’์ด ์ „์—ญ ๋ณ€์ˆ˜์—ฌ์•ผ ํ–ˆ์„ ๊ฒƒ์ด๋‹ค.
ํด๋กœ์ €๋กœ ๋ถˆํ•„์š”ํ•œ ์ „์—ญ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์„ ์ค„์ด๊ณ  , ๊ฐ’์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

counter1๊ณผ counter2์—์„œ value๋Š” ๊ฐ๊ฐ ๋…๋ฆฝ์ ์ด๋ผ์„œ ์„œ๋กœ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๋Š”๋‹ค.