thumbnail
๐Ÿฅ‡ JS์—์„œ ํ•จ์ˆ˜๊ฐ€ 1๊ธ‰ ๊ฐ์ฒด์ธ ์ด์œ 
Javascript
2022.06.17

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด๋ผ์„œ ์ผ๋ฐ˜์ ์ธ ๊ฐ์ฒด์˜ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€์ ์œผ๋กœ ํ•จ์ˆ˜์˜ ๊ธฐ๋Šฅ(ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ ์ง€์ •๋œ ๋กœ์ง ์ˆ˜ํ–‰ํ•˜๊ธฐ)๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, ํ•จ์ˆ˜์—๋Š” ์ผ๋ฐ˜ ๊ฐ์ฒด์™€ ๋‹ค๋ฅด๊ฒŒ ํ•จ์ˆ˜๋งŒ์˜ ํ‘œ์ค€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค.


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๊ธ‰ ๊ฐ์ฒด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ  ๋‚ด์šฉ

mdn web docs

Javascript์—์„œ ์™œ ํ•จ์ˆ˜๊ฐ€ 1๊ธ‰ ๊ฐ์ฒด์ผ๊นŒ์š”? by Soeun

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜ by 2langk

์ผ๊ธ‰ ๊ฐ์ฒด by reveloper

Thank You for Visiting My Blog, Have a Good Day ๐Ÿ˜Š
ยฉ2021 Developer minkyung choi, Powered By Gatsby.