์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ ๊ฐ์ฒด์ด๋ค.
ํจ์๊ฐ ๊ฐ์ฒด๋ผ์ ์ผ๋ฐ์ ์ธ ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ธ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ถ๊ฐ์ ์ผ๋ก ํจ์์ ๊ธฐ๋ฅ(ํธ์ถ๋์์ ๋ ์ง์ ๋ ๋ก์ง ์ํํ๊ธฐ)๋ ์ํํ ์ ์๋ค.
ํ์ง๋ง, ํจ์์๋ ์ผ๋ฐ ๊ฐ์ฒด์ ๋ค๋ฅด๊ฒ ํจ์๋ง์ ํ์ค ํ๋กํผํฐ๊ฐ ์ ์๋์ด ์๋ค.
function multiply(num1, num2) {
return num1 * num2
}
-
console.dir()
๋ก ํ์ธํด๋ณด๋, multiply ํจ์์ ๋ค๋ฅธ ํ๋กํผํฐ๋ฅผ ์ ์ธํ์ง ์์๋๋ฐ๋arguments
,caller
,length
๋ฑ ๋ชจ๋ฅด๋ ํ๋กํผํฐ๊ฐ ๋ณด์ธ๋ค. -
ํจ์๋ ์์ฑ์ ํจ์ ๋ฐฉ์์ผ๋ก ๋ง๋ค์ด์ง๋ค.
// ํจ์์ ์์ฑ์ ํจ์ new Function(arg1, arg2, ...argN, functionBody) // ์์ฑ์ ํจ์๋ก ๋ง๋ multiply ๊ฐ์ฒด(ํจ์) const multiply = new Function('num1', 'num2', 'return num1 * num2') // JS์์ ํจ์๋ ํธ์ถ์ด ๊ฐ๋ฅํ ํน๋ณํ ๊ฐ์ฒด์ด๋ค multiply(2, 5) // 10
๊ทธ๋ฌ๋ฉด.. 1๊ธ ๊ฐ์ฒด๋ ๋ญ์ง?
์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ฅผ 1๊ธ ๊ฐ์ฒด(First-Class Citizen)๋ผ๊ณ ํํํ๋ค.
ํ์์ ๋ด๊ฐ ์๊ณ ์๋ First Class Citizen์ด๋,
์์ ๋กญ๊ฒ ๊ฑฐ์ฃผํ๊ณ ์ผํ ์ ์๊ณ , ์ถ์ ๊ตญ์ ์์ ๋ฅผ ๊ฐ์ง๋ฉฐ, ํฌํ์ ์์ ๋ฅผ ๊ฐ์ง๋ ์๋ฏผ์ ์๋ฏธํ๋ค.
- Second Class Citizen์ด๋ ์๋ฏผ ๋๋ ํฉ๋ฒ์ ์ธ ๊ฑฐ์ฃผ์์ด์ง๋ง ์๋ฏผ๊ถ ๋ฐ ์ฌํ ๊ฒฝ์ ์ ๊ธฐํ๊ฐ ์ ํ๋์ด ์๋ ์๋ฏผ์ ์๋ฏธํ๋ค. ์๋ฅผ ๋ค๋ฉด, 19์ธ๊ธฐ ์ด ์ฐธ์ ๊ถ์ ๊ฐ์ง์ง ๋ชปํ ์ฌ์ฑ์ โSecond Class Citizenโ์ด๋ผ๊ณ ํ ์ ์๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ๊ณ์๋ ๋น์ทํ ๊ฐ๋ ์ด ์กด์ฌํ๋ค.
ํน์ ์ธ์ด์ First-Class Citizen์ด๋, ๋ค๋ฅธ ๊ฐ์ฒด๋ค์๊ฒ ์ ์ฉ ๊ฐ๋ฅํ ์ฐ์ฐ์ ๋ชจ๋ ์ง์ํ๋ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค.
์ฆ, Type์ ์ ๋ฌํ๊ณ ๋ฐํํ๊ณ ํ ๋นํ ์ ์๋ ๊ฒฝ์ฐ์ ํด๋น Type์ 1๊ธ ๊ฐ์ฒด๋ก ๊ฐ์ฃผํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ ์ ๋ ฅ ๊ฐ์ ๋ฐ์ผ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ตฌ์กฐ๋ฉด์, ํจ์ ์์ฒด๋ฅผ ๊ฐ์ผ๋ก ์ทจ๊ธํ๋ค.
ํจ์๋ฅผ ๋ฐํํ ์๋ ์๊ณ ํจ์๋ฅผ ๋ฐ์ ์ ์๋ ํจ์๋ ๋ง๋ค ์ ์์ผ๋
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ธ๊ธฐ๊ฐ ์๋ ์ด์ ์ด๊ธฐ๋ ํ๋ค!
1๊ธ ๊ฐ์ฒด์ผ ๋ ์ฅ์ ์?
- ํ๋ ์ด์์ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๊ฑฐ๋ ํจ์๋ฅผ ๋ฐํํ๋ ๊ณ ์ฐจ ํจ์(Higher Order Function)๋ฅผ ๋ง๋ค ์ ์๋ค.
- Javascript filter, map, sort ํจ์์ ๋นํด ํจ์จ์
- ์ฝ๋ฐฑ(Callback)์ ์ฌ์ฉํ ์ ์๋ค.
1๊ธ ๊ฐ์ฒด์ ์กฐ๊ฑด
- ๋ณ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ํ ๋นํ ์ ์๋ค.
- ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ ์ ์๋ค.
- ๋ฐํ ๊ฐ(return value)์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
๐จ ํจ์ ํ ๋น
1. ๋ณ์์ ํจ์ ํ ๋น
ํจ์ ํํ์์ ๋ ์ฌ๋ฆฌ๋ฉด ๋๋ค.
const sum = function (num) {
return num + num
}
// ๋ณ์๋ฅผ ์ฌ์ฉํด ํธ์ถ
sum(1)
-
ํจ์๊ฐ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์์ด๋, ํ ๋นํ ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํด ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค.
-
์ด๋ฆ์ ์ง์ ํ๋ฉด ์ฝ๋๋ฅผ ๋๋ฒ๊น ํ ๋ ์ ์ฉํ๊ณ , ํธ์ถ ๋ฐฉ์์๋ ์ํฅ์ด ์๋ค.
2. ํจ์๋ฅผ ๊ฐ์ฒด์ ํค ๊ฐ์ผ๋ก ํ ๋น
let movie = {
name: '๊ธฐ์์ถฉ',
director: '๋ด์คํธ',
show: function () {
console.log(movie.name + ' - ', move.director)
},
}
๐ฉ ํจ์ ์ ๋ฌ
ํจ์๋ฅผ ์ธ์(argument)๋ก ์ ๋ฌ
function sayHello() {
return 'Hello, '
}
function greeting(helloMessage, name) {
console.log(helloMessage() + name) // Hello, JavaScript!
}
// `sayHello`๋ฅผ `greeting` ํจ์์ ์ธ์๋ก ์ ๋ฌ
greeting(sayHello, 'JavaScript!')
sayHello()
ํจ์๋ฅผ greeting()
ํจ์์ ์ธ์๋ก ์ ๋ฌํ๋ค.
์ด ๋, ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ ๋ฌ๋ ํจ์๋ฅผ ์ฝ๋ฐฑ ํจ์๋ผ๊ณ ํ๋ค. ๋ฐ๋ผ์, sayHello
๋ ์ฝ๋ฐฑ ํจ์์ด๋ค.
๋ค๋ฅธ ์์๋ฅผ ํ ๋ฒ ๋ ์ดํด๋ณด์.
function add(num) {
return num + num
}
// func๋ ๋งค๊ฐ๋ณ์๋ก, ์ด๋ฆ์ ์๋ฌด๊ฑฐ๋ ์ง์ ํด๋ ์๊ด์๋ค.
function addNum(func, number) {
return func(number)
}
let result = addNum(add, 3) // 9
-
result
๋ณ์์addNum()
ํจ์๋ฅผ ํ ๋นํ๊ณ , ์ธ์๋กadd()
๋ฅผ ๋ฐ๋๋ค. -
์ด ๋,
addNum()
์ธ์๋ก ๋ค๋ฅธ ํจ์add()
๋ฅผ ๋ฐ์์จ๋ค.
๐ฎ ํจ์ ๋ฐํ
๊ณ ์ฐจ ํจ์(Higher-order function)
function sayHello() {
return function () {
console.log('Hello!')
}
}
ํจ์๊ฐ ํจ์๋ฅผ ๋ฐํํ๋ ๊ฒ์ผ๋ก, ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํจ์๋ฅผ ๋ณ์์ฒ๋ผ ์ทจ๊ธํ๊ธฐ ๋๋ฌธ์ ํจ์๋ฅผ ๋ฐํํ ์ ์๋ค.
1. ๋ณ์ ์ฌ์ฉํด์ ํธ์ถํ๊ธฐ
const sayHello = function () {
return function () {
console.log('Hello!')
}
}
const myFunc = sayHello()
myFunc() // Hello!
๋ง์ฝ์ sayHello
ํจ์๋ฅผ ์ง์ ํธ์ถํ๋ฉด, ๋ฐํ๋ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ์๋๋ผ, ํจ์ ์์ฒด๋ฅผ ๋ฐํํ๋ค.
๊ทธ๋์ ๋ฐํ๋ ํจ์๋ฅผ ๋ค๋ฅธ ๋ณ์์ ์ ์ฅํ์ฌ ์ฌ์ฉํด์ผ ํ๋ค.
2. ์ด์ค ๊ดํธ ์ฌ์ฉํด์ ํธ์ถํ๊ธฐ
function sayHello() {
return function () {
console.log('Hello!')
}
}
sayHello()()
์ด์ค ๊ดํธ ()()
๋ฅผ ์ฌ์ฉํด์ ๋ฐํํ ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค.
โจ ์ ๋ฆฌ
ํจ์๋ฅผ ๋ณ์๋ ๋ฐ์ดํฐ์ ํ ๋นํ ์ ์๋ค. = ๋ณ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์์ ๋ด์ ์ ์๋ค.
ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ ์ ์๋ค. = ํ๋ผ๋ฏธํฐ(parameter)๋ก ์ ๋ฌํ ์ ์๋ค.
ํจ์๋ฅผ ๋ฆฌํดํ ์ ์๋ค. = ๋ฐํ ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ ์์ ์กฐ๊ฑด์ ๋ชจ๋ ์ถฉ์กฑํ๋๊น 1๊ธ ๊ฐ์ฒด๋ผ๊ณ ํ ์ ์๋ค.
์ฐธ๊ณ ๋ด์ฉ
Javascript์์ ์ ํจ์๊ฐ 1๊ธ ๊ฐ์ฒด์ผ๊น์? by Soeun