[ JavaScript ๋ฌธ๋ฒ• ์ข…ํ•ฉ๋ฐ˜ 2์ฃผ์ฐจ (3-4)] ์ผ๊ธ‰ ๊ฐ์ฒด๋กœ์„œ์˜ ํ•จ์ˆ˜

2023. 8. 1. 13:36ใ†2. JS๋ฌธ๋ฒ• ์ข…ํ•ฉ

์ผ๊ธ‰ ๊ฐ์ฒด๋กœ์„œ์˜ ํ•จ์ˆ˜

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด (First-Class Object) ๋ผ๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํ•จ์ˆ˜๋ฅผ ๊ฐ์ฒด ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

์ผ๋ฐ˜ ๊ฐ์ฒด์™€ ๋‹ฌ๋ฆฌ ํ•จ์ˆ˜๋Š” ํŠน๋ณ„ํ•œ ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์ผ๊ธ‰ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งค์šฐ ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ฐœ๋…* ์œผ๋กœ ๋ณธ๋‹ค. 

์ผ๊ธ‰๊ฐ์ฒด(First-class Object)๋ž€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์— ์ผ๋ฐ˜์ ์œผ๋กœ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ์„ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. [์œ„ํ‚ค๋ฐฑ๊ณผ]

 

ํ•จ์ˆ˜๊ฐ€ ์ผ๊ธ‰ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰๋˜๋Š” 5๊ฐ€์ง€ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

 


 

  • 1. ๋ณ€์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹น 
    : ํ•จ์ˆ˜๋Š” ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜๋Š” ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ๋ณ€์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ํ•จ์ˆ˜๋Š” ๋‚˜์ค‘์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
const sayHello = function() {
  console.log('Hello!');
};

sayHello(); // "Hello!" ์ถœ๋ ฅ
// (1) ๋ณ€์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ๋‹ค.
// ํ•จ์ˆ˜๊ฐ€ ๋งˆ์น˜ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰๋œ๋‹ค.
// ํ•จ์ˆ˜๊ฐ€ ๋‚˜์ค‘์— ์‚ฌ์šฉ ๋  ์ˆ˜ ์žˆ๋„๋ก ์กฐ์น˜๊ฐ€ ๋˜์—ˆ๋‹ค.
const sayhello = function (){
console.log("hello!");
}

sayhello()
---------------------------------------
mac@macui-MacBook-Pro Week_2 % node 04.js
hello!

 


  • 2. ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ „๋‹ฌ
    ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ธ์ž๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ์ฝœ๋ฐฑ(callback)์ด๋‚˜ ๊ณ ์ฐจ ํ•จ์ˆ˜(higher-order function)๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

 

1) ์ฝœ๋ฐฑํ•จ์ˆ˜ :  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์–ด๋– ํ•œ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์“ฐ์ด๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค.

2) ๊ณ ์ฐจํ•จ์ˆ˜(Higher-Order Function) : ๊ณ ์ฐจ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ถœ๋ ฅ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค. ( = ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฃจ๋Š” ํ•จ์ˆ˜) ์ •๋ฆฌํ•˜๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ๊ณ ์ฐจํ•จ์ˆ˜๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

function callFunction(func) {
  func();
}

const sayHello = function() {
  console.log('Hello!');
};

callFunction(sayHello); // "Hello!" ์ถœ๋ ฅ
/ (2) ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.
// (2)-1. ์ฝœ๋ฐฑํ•จ์ˆ˜ : ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ์„œ ์“ฐ์ด๋Š” ํ•จ์ˆ˜
// (2)-2. ๊ณ ์ฐจํ•จ์ˆ˜ : ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ returnํ•˜๋Š” ํ•จ์ˆ˜
function callFunction (func){
// //๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์‹ค, ํ•จ์ˆ˜๋‹ค.
func();

}
const sayhello = function (){
console.log("hello!");
};

callFunction(sayhello);
----------------------------------------------
mac@macui-MacBook-Pro Week_2 % node 04.js
hello!

 


 

  • 3. ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
    ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜๋Š” ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ํ•จ์ˆ˜ ํŒฉํ† ๋ฆฌ(factory)๋‚˜ ํด๋กœ์ €(closure)๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
function createAdder(num) {
  return function(x) {
    return x + num;
  }
}

const addFive = createAdder(5);
console.log(addFive(10)); // 15 ์ถœ๋ ฅ

 


 

  • 4. ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ํ•จ์ˆ˜๋ฅผ ํ• ๋‹น 
    ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
const person = {
  name: 'John',
  sayHello: function() {
    console.log(`Hello, my name is ${this.name}`);
  }
};

person.sayHello(); // "Hello, my name is John" ์ถœ๋ ฅ
// ์ผ๊ธ‰๊ฐ์ฒด๋กœ์„œ์˜ ํ•จ์ˆ˜(2)
const person = {
name : 'john',
age : 31,
isMarried : true,
sayhello: function() {
console.log("hello, my name is " + this.name);
},
};
// ์ƒ๋‹จ์—์„œ ๋งํ•˜๋Š” this -> person ์„ ๋งํ•œ๋‹ค.

person.sayhello();
----------------------------------
mac@macui-MacBook-Pro Week_2 % node 05.js
hello, my name is john

- ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด ( ๋ฐฑํ‹ฑ('') ๊ณผ ๊ธฐํ˜ธ ${} ) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•ด๋ณด๊ธฐ

 : +(ํ”Œ๋Ÿฌ์Šค) ์—ฐ์‚ฐ์ž ์—†์ด ํ…œํ”„๋ฆด ๋ฆฌํ„ฐ๋Ÿด์˜ ๋ฐฑํ‹ฑ('') ๊ณผ ๊ธฐํ˜ธ ${} ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•˜๊ฒŒ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜ค๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

// ์ผ๊ธ‰๊ฐ์ฒด๋กœ์„œ์˜ ํ•จ์ˆ˜(2)
const person = {
    name : 'john',
    age : 31,
    isMarried : true,
    sayhello: function() {
        // console.log("hello, my name is " + this.name);
        console.log(`Hello, My name is ${this.name}`); 
    
    },
};
// ์ƒ๋‹จ์—์„œ ๋งํ•˜๋Š” this -> person ์„ ๋งํ•œ๋‹ค. 

person.sayhello();
-------------------------------------
mac@macui-MacBook-Pro Week_2 % node 05.js
Hello, My name is john

 

์™ผ์ชฝ ์˜ˆ์‹œ์™€๊ฐ™์ด, ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์˜€์œผ๋‚˜

๊ฒฐ๊ณผ๊ฐ’์„ ๋ณด๋ฉด undefind๋กœ ํ™•์ธ ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” this๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•˜์ง€์•Š๋Š”๋‹ค.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

  • 5. ๋ฐฐ์—ด์˜ ์š”์†Œ๋กœ ํ•จ์ˆ˜๋ฅผ ํ• ๋‹น
    ํ•จ์ˆ˜๋Š” ๋ฐฐ์—ด์˜ ์š”์†Œ๋กœ ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ํ•จ์ˆ˜๋ฅผ ๋ฐฐ์—ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
const myArray = [
  function(a, b) {
    return a + b;
  },
  function(a, b) {
    return a - b;
  }
];

console.log(myArray[0](5, 10)); // 15 ์ถœ๋ ฅ
console.log(myArray[1](10, 5)); // 5 ์ถœ๋ ฅ