๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“‚ Language/JavaScript

JavaScript ๋‚ด์žฅ ํ•จ์ˆ˜์˜ ์„ธ๊ณ„ - apply

by Dev. Ella 2024. 1. 15.

1. ๊ถ๊ธˆ์ฆ์„ ๊ฐ€์ง„ ๊ณ„๊ธฐ

function solution(s) {
    const numbers = s.split(' ').map(Number);
    const min = Math.min(...numbers);
    const max = Math.max(...numbers);

 return `${min} ${max}`;
}

 

์œ„์˜ ์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์—์„œ spread syntax๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Math.min( )๊ณผ Math.max( )๋ฅผ ์ ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์„์ง€ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ apply ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌ.

 

 

2. apply ๋ฉ”์„œ๋“œ๋ž€?

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

 

const numbers = [5, 6, 2, 3, 7];

const max = Math.max.apply(null, numbers);
console.log(max); // 7

const min = Math.min.apply(null, numbers);
console.log(min); // 2

 

 

3. apply( )๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ 

JavaScript์—์„œ Math.max( )์™€ Math.min( ) ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ๋ฐ›์•„ ๊ทธ์ค‘ ์ตœ๋Œ“๊ฐ’๊ณผ ์ตœ์†Ÿ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ๋ฐฐ์—ด์„ ์ง์ ‘์ ์œผ๋กœ ์ธ์ˆ˜๋กœ ๋ฐ›์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฐ์—ด์— ์žˆ๋Š” ์—ฌ๋Ÿฌ ์š”์†Œ๋“ค์„ ๊ฐœ๋ณ„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด apply( ) ๋ฉ”์„œ๋“œ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

 

ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœ๋  ๋•Œ, this๋Š” ๊ทธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋˜๊ฑฐ๋‚˜ apply, call ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” this์˜ ๊ฐ’์ด ๋ช…์‹œ์ ์œผ๋กœ ์ •ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค. apply ๋ฉ”์„œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” thisArg๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋  this์˜ ๊ฐ’์ด๋‹ค. ๋ณดํ†ต์˜ ๊ฒฝ์šฐ, Math.max( )์™€ Math.min( ) ๋ฉ”์„œ๋“œ๋Š” this๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ธฐ์— null์ด๋‚˜ undefined๋กœ ์„ค์ •ํ•œ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด, apply ๋ฉ”์„œ๋“œ๋Š” ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ๋ณ„๋„์˜ ์ธ์ž๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋Š” ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋Š” ํŠนํžˆ ๋ฐฐ์—ด์„ ๋‹ค๋ฃฐ ๋•Œ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค.

 

 

4. apply( ) ์‚ฌ์šฉ์˜ ์ด์ 

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐฐ์—ด numbers์— apply( ) ์—†์ด Math.max( )์™€ Math.min( )๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด NaN์ด ์ถœ๋ ฅ๋œ๋‹ค.

 

const numbers = [5, 6, 2, 3, 7];

const max = Math.max(numbers);
console.log(max); // NaN

const min = Math.min(numbers);
console.log(min); // NaN


์ •๋ฆฌํ•˜์ž๋ฉด apply( )๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

(1) ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ๊ฐœ๋ณ„ ์ธ์ˆ˜๋กœ ๋ณ€ํ™˜

apply( ) ๋ฉ”์„œ๋“œ๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ this ๊ฐ’(์—ฌ๊ธฐ์„œ๋Š” null ๋˜๋Š” undefined)์„ ๋ฐ›๊ณ , ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ธ์ˆ˜ ๋ชฉ๋ก์„ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ฐ›๋Š”๋‹ค. apply( )๋Š” ์ด ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค์„ ๊ฐœ๋ณ„ ์ธ์ˆ˜๋กœ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•œ๋‹ค. ์ด๋Š” Math.max( )๋‚˜ Math.min( )๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ์ธ์ˆ˜๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜์— ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค์„ ๊ฐœ๋ณ„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค.

 

(2) ๊ฐ„๊ฒฐํ•˜๊ณ  ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ

๋ฐฐ์—ด์— ์ €์žฅ๋œ ์—ฌ๋Ÿฌ ๊ฐ’์„ Math.max( )๋‚˜ Math.min( )์— ์ „๋‹ฌํ•˜๋ ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฐฐ์—ด์„ ํ•ด์ฒดํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ apply( )๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๊ณผ์ •์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์–ด, ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค.

 

 

5. apply ์—†์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๊ทธ๋ฆฌํ•˜์—ฌ.. ES6 ์ดํ›„์—๋Š” apply( )๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์ „๊ฐœ ๊ตฌ๋ฌธ(spread syntax) ๋ฌธ๋ฒ•(...)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ๊ฐœ๋ณ„ ์ธ์ˆ˜๋กœ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. spread syntax๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด apply( )์™€ ์œ ์‚ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ๋” ๊น”๋”ํ•˜๊ณ  ํ˜„๋Œ€์ ์ธ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

const numbers = [5, 6, 2, 3, 7];

const max = Math.max(...numbers); // 7
const min = Math.min(...numbers); // 2

 

 

6. call๊ณผ์˜ ์ฐจ์ด

call( ) ๋˜ํ•œ ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋ฅผ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•œ ๋ฆฌ์ŠคํŠธ ํ˜•์‹์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.  ์ด์ฒ˜๋Ÿผ apply( )์™€ call( )๋Š” ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์— ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹๋งŒ ๋‹ค๋ฅผ ๋ฟ, this๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ๋™์ผํ•˜๋‹ค.

 

function getThisBinding() {
    console.log(arguments);
    return this;
}

// this๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด
const thisArg = { a: 1 };

console.log(getThisBinding.apply(thisArg, [1, 2, 3]));
// Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]
// {a: 1}

console.log(getThisBinding.call(thisArg, 1, 2, 3));
// Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]
// {a: 1}

 

 

7. splice์— ์‚ฌ์šฉํ•˜๊ธฐ

const arr1 = [1, 4];
const arr2 = [2, 3];

arr1.splice(1, 0, arr2);

 

์œ„ ์˜ˆ์ œ์— ๋”ฐ๋ฅด๋ฉด 3๋ฒˆ์งธ ์ธ์ˆ˜ arr2๋ฅผ ํ•ด์ฒดํ•ด ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด arr1์— arr2 ๋ฐฐ์—ด์ด ์ถ”๊ฐ€๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ apply()๋ฅผ ์ด์šฉํ•ด splice()๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. apply()์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜(๋ฐฐ์—ด)๋Š” apply()๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜์— ํ•ด์ฒด๋˜์–ด ์ „๋‹ฌ๋œ๋‹ค.

 

const arr1 = [1, 4];
const arr2 = [2, 3];

Array.prototype.splice.apply(arr1, [1, 0].concat(arr2));
console.log(arr1) // [1, 2, 3, 4]

 

๋‹จ, ์•„๋ž˜์™€ ๊ฐ™์ด ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

const arr1 = [1, 4];
const arr2 = [2, 3];

arr1.splice(1, 0, ...arr2);
console.log(arr1) // [1, 2, 3, 4]

 

 

8. ๊ฒฐ๋ก 

๊ฒฐ๋ก ์ ์œผ๋กœ, apply( )๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ฃผ๋กœ ๊ตฌํ˜• ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ์—์„œ ํ•„์š”ํ•˜๋ฉฐ, ํ˜„๋Œ€์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” spread ๋ฌธ๋ฒ•์ด ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ณ  ์„ ํ˜ธ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๋Œ“๊ธ€