diff options
author | alattalatta <urty5656@gmail.com> | 2021-09-23 21:12:08 +0900 |
---|---|---|
committer | hochan Lee <hochan049@gmail.com> | 2021-10-11 20:54:05 +0900 |
commit | 102f430bedce56786008fcc1877057fbe45a4ded (patch) | |
tree | 5b57838c33f0e7e7a1a2e80e71c2c2b0e5e42b48 /files/ko | |
parent | d28e340e083d4ca07e848118cb5fbc562368f2b8 (diff) | |
download | translated-content-102f430bedce56786008fcc1877057fbe45a4ded.tar.gz translated-content-102f430bedce56786008fcc1877057fbe45a4ded.tar.bz2 translated-content-102f430bedce56786008fcc1877057fbe45a4ded.zip |
Rewrite Rest parameters
Diffstat (limited to 'files/ko')
-rw-r--r-- | files/ko/web/javascript/reference/functions/rest_parameters/index.md | 275 |
1 files changed, 139 insertions, 136 deletions
diff --git a/files/ko/web/javascript/reference/functions/rest_parameters/index.md b/files/ko/web/javascript/reference/functions/rest_parameters/index.md index 250b7c2931..6acc71dd78 100644 --- a/files/ko/web/javascript/reference/functions/rest_parameters/index.md +++ b/files/ko/web/javascript/reference/functions/rest_parameters/index.md @@ -1,31 +1,34 @@ --- -title: Rest 파라미터 +title: 나머지 매개변수 slug: Web/JavaScript/Reference/Functions/rest_parameters tags: - Functions - JavaScript - - Rest - - Rest parameters + - Language feature + - Reference +browser-compat: javascript.functions.rest_parameters translation_of: Web/JavaScript/Reference/Functions/rest_parameters --- -<div>{{jsSidebar("Functions")}}</div> +{{jsSidebar("Functions")}} -<p><strong>Rest 파라미터</strong> 구문은 정해지지 않은 수(an indefinite number, 부정수) 인수를 배열로 나타낼 수 있게 합니다.</p> +**나머지 매개변수** 구문을 사용하면 함수가 정해지지 않은 수의 매개변수를 배열로 받을 수 있습니다. JavaScript에서 [가변항 함수](https://en.wikipedia.org/wiki/Variadic_function)를 표현할 때 사용합니다. -<p>{{EmbedInteractiveExample("pages/js/functions-restparameters.html")}}</p> +{{EmbedInteractiveExample("pages/js/functions-restparameters.html")}} -<h2 id="구문">구문</h2> +## 구문 -<pre class="brush: js">function f(a, b, ...theArgs) { +```js +function f(a, b, ...theArgs) { // ... } -</pre> +``` -<h2 id="설명">설명</h2> +## 설명 -<p>함수의 마지막 파라미터의 앞에 <code>...</code> 를 붙여 (사용자가 제공한) 모든 나머지 인수를 "표준" 자바스크립트 배열로 대체합니다. 마지막 파라미터만 "Rest 파라미터" 가 될 수 있습니다.</p> +함수의 마지막 매개변수 앞에 "`...`"(세 개의 U+002E FULL STOP 문자)를 붙이면 (사용자가 제공한) 모든 후속 매개변수를 [표준 JavaScript 배열](/ko/docs/Web/JavaScript/Reference/Global_Objects/Array)에 넣도록 지정합니다. 마지막 매개변수만 나머지 매개변수로 설정할 수 있습니다. -<pre class="brush: js">function myFun(a, b, ...manyMoreArgs) { +```js +function myFun(a, b, ...manyMoreArgs) { console.log("a", a); console.log("b", b); console.log("manyMoreArgs", manyMoreArgs); @@ -33,181 +36,181 @@ translation_of: Web/JavaScript/Reference/Functions/rest_parameters myFun("one", "two", "three", "four", "five", "six"); -// Console Output: +// 콘솔 출력: // a, one // b, two -// manyMoreArgs, [three, four, five, six]</pre> +// manyMoreArgs, [three, four, five, six] +``` -<p> </p> +### 빠른 참조 -<h3 id="Rest_파라미터_및_arguments_객체간_차이">Rest 파라미터 및 <code>arguments</code> 객체간 차이</h3> +함수 정의에는 하나의 `...`만 존재할 수 있습니다. -<p>Rest 파라미터와 <a href="/ko/docs/Web/JavaScript/Reference/Functions/arguments"><code>arguments</code></a> 객체 사이에 세 가지 주요 차이점이 있습니다:</p> +```js example-bad +foo(...one, ...wrong, ...wrong) +``` -<ul> - <li>Rest 파라미터는 구분된 이름(예, 함수 표현에 정식으로 정의된 것)이 주어지지 않은 유일한 대상인 반면, <code>arguments</code> 객체는 함수로 전달된 모든 인수를 포함합니다.</li> - <li><code>arguments</code> 객체는 실제 배열이 아니고 rest 파라미터는 <a href="/ko/docs/Web/JavaScript/Reference/Global_Objects/Array"><code>Array</code></a> 인스턴스로, <a href="/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort"><code>sort</code></a>, <a href="/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map"><code>map</code></a>, <a href="/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach"><code>forEach</code></a> 또는 <a href="/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/pop"><code>pop</code></a> 같은 메서드가 바로 인스턴스에 적용될 수 있음을 뜻합니다.</li> - <li>즉 <code>arguments</code> 객체는 자체에 특정 추가 기능이 있습니다 (<code>callee</code> 속성처럼).</li> -</ul> +나머지 매개변수는 반드시 함수 정의의 마지막 매개변수여야 합니다. -<h3 id="arguments에서_배열까지">arguments에서 배열까지</h3> +```js example-bad +foo(...wrong, arg2, arg3) +``` -<p>Rest 파라미터는 인수에 의해 유발된 상용구(boilerplate) 코드를 줄이기 위해 도입되었습니다.</p> +```js example-good +foo(arg1, arg2, ...correct) +``` -<pre class="brush: js">// Rest 파라미터 이전에, "arguments" 는 다음을 사용해 일반적인 배열로 변환될 수 있음 +### 나머지 매개변수와 `arguments` 객체의 차이 -function f(a, b) { +나머지 매개변수와 {{jsxref("Functions/arguments", "arguments")}} 객체 사이에는 세 개의 주요 차이가 있습니다. + +- `arguments` 객체는 **실제 배열이 아닙니다**. 그러나 나머지 매개변수는 {{jsxref("Array")}} 인스턴스이므로 {{jsxref("Array.sort", "sort")}}, {{jsxref("Array.map", "map")}}, {{jsxref("Array.forEach", "forEach")}}, {{jsxref("Array.pop", "pop")}} 등의 메서드를 직접 적용할 수 있습니다. +- `arguments` 객체는 `callee` 속성과 같은 추가 기능을 포함합니다. +- `...restParam`은 후속 매개변수만 배열에 포함하므로 `...restParam` **이전**에 직접 정의한 매개변수는 포함하지 않습니다. 그러나 `arguments` 객체는, `...restParam`의 각 항목까지 더해 모든 매개변수를 포함합니다. + +### 인수에서 배열로 + +나머지 매개변수는 다수의 인수를 배열로 변환하는 과정의 보일러플레이트 코드를 줄이기 위해 도입됐습니다. - var normalArray = Array.prototype.slice.call(arguments); +```js +// 나머지 매개변수 이전에 "arguments"를 일반 배열로 변환하던 방법 +function f(a, b) { + let normalArray = Array.prototype.slice.call(arguments) // -- 또는 -- - var normalArray = [].slice.call(arguments); + let normalArray = [].slice.call(arguments) // -- 또는 -- - var normalArray = Array.from(arguments); - - var first = normalArray.shift(); // OK, 첫 번째 인수를 반환 - var first = arguments.shift(); // ERROR (arguments 가 일반적인 배열이 아님) + let normalArray = Array.from(arguments) + let first = normalArray.shift() // 동작, 첫 번째 매개변수 반환 + let first = arguments.shift() // 오류, arguments는 실제 배열이 아님 } -// 이제 rest 파라미터를 사용해 쉽게 일반적인 배열에 접근할 수 있음 +// 이제는 나머지 매개변수를 사용해 쉽게 배열로 가져올 수 있음 function f(...args) { - var normalArray = args; - var first = normalArray.shift(); // OK, 첫 번째 인수를 반환 -}</pre> + let normalArray = args + let first = normalArray.shift() // 동작, 첫 번째 매개변수 반환 +} +``` + +## 예제 -<h3 id="Rest_파라미터_해체">Rest 파라미터 해체</h3> +### 나머지 매개변수 사용하기 -<p>Rest 파라미터는 해체될 수 있습니다(배열로만). 이는 데이터가 구분된 변수로 해체될 수 있음을 의미합니다. <a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment">구조 분해 할당</a> 문서를 보세요.</p> +아래 예제에서, 첫 번째 인수는 `a`, 두 번째 인수는 `b`로 맵핑되므로 이 두 개의 인수는 일반적인 방법으로 사용할 수 있습니다. -<pre class="brush: js">function f(...[a, b, c]) { - return a + b + c; +그러나 세 번째 인수인 `manyMoreArgs`는 셋, 넷, 다섯, 여섯, ... n번째 인수까지, 사용자가 제공한 만큼의 인수를 포함한 배열입니다. + +```js +function myFun(a, b, ...manyMoreArgs) { + console.log("a", a) + console.log("b", b) + console.log("manyMoreArgs", manyMoreArgs) } -f(1) // NaN (b 와 c 는 undefined) -f(1, 2, 3) // 6 -f(1, 2, 3, 4) // 6 (4번 째 파라미터는 해체되지 않음)</pre> +myFun("one", "two", "three", "four", "five", "six") -<h2 id="예제">예제</h2> +// a, "one" +// b, "two" +// manyMoreArgs, ["three", "four", "five", "six"] <-- 배열임에 주목 +``` -<p>이 예제에서, 첫 번째 인수는 <code>"a"</code>, 두 번째 인수는 <code>"b"</code> 로 매핑되어, 일반적인 유명 인수와 같이 사용됩니다. 반면에 3번 째 인수 <code>"manyMoreArgs"</code> 는 사용자가 포함시킨 인수를 포함하는 배열이 됩니다.</p> +매개변수를 세 개만 제공하더라도 마지막 인수는 여전히 배열인 것을 확인할 수 있습니다. -<pre class="brush: js">function myFun(a, b, ...manyMoreArgs) { - console.log("a", a); - console.log("b", b); - console.log("manyMoreArgs", manyMoreArgs); -} +```js +// 위에 정의한 함수를 그대로 사용 -myFun("one", "two", "three", "four", "five", "six"); +myFun("one", "two", "three") -// a, one -// b, two -// manyMoreArgs, [three, four, five, six]</pre> +// a, "one" +// b, "two" +// manyMoreArgs, ["three"] <-- 요소가 하나지만 여전히 배열임 +``` -<p>아래를 보면, 하나의 값만 있더라도 마지막 인수는 여전히 배열을 갖습니다.</p> +그리고 아래에선 매개변수를 두 개만 제공했지만, `manyMoreArgs`는 여전히 (빈) 배열입니다. -<pre class="brush: js">// 위 예제와 동일한 함수 정의를 사용 +```js +// 위에 정의한 함수를 그대로 사용 -myFun("one", "two", "three"); +myFun("one", "two") -// a, one -// b, two -// manyMoreArgs, [three]</pre> +// a, "one" +// b, "two" +// manyMoreArgs, [] <-- 여전히 배열 +``` -<p>아래를 보면, 3번 째 인수가 제공되지 않더라도, "manyMoreArgs" 는 여전히 배열입니다(비어있긴하지만).</p> +### 매개변수 길이 -<pre class="brush: js">// 위 예제와 동일한 함수 정의를 사용 +`theArgs`가 배열이므로, `length` 속성을 사용하면 길이를 알아낼 수 있습니다. -myFun("one", "two"); +```js +function fun1(...theArgs) { + console.log(theArgs.length) +} -// a, one -// b, two -// manyMoreArgs, []</pre> +fun1() // 0 +fun1(5) // 1 +fun1(5, 6, 7) // 3 +``` + +### 나머지 매개변수를 일반 매개변수와 함께 사용하기 -<p><code>theArgs</code> 가 배열이므로, <code>length</code> 프로퍼티를 사용해 엘리먼트의 수를 얻을 수 있습니다.</p> +이 예제에서는 첫 번째 이후의 모든 매개변수를 배열에 모은 후, 각각의 값을 첫 번째 매개변수로 곱한 결과를 반환합니다. -<pre class="brush: js">function fun1(...theArgs) { - console.log(theArgs.length); +```js +function multiply(multiplier, ...theArgs) { + return theArgs.map(element => { + return multiplier * element + }) } -fun1(); // 0 -fun1(5); // 1 -fun1(5, 6, 7); // 3</pre> +let arr = multiply(2, 15, 25, 42) +console.log(arr) // [30, 50, 84] +``` -<p>다음 예제에서, rest 파라미터는 첫 번째 인수 다음의 모든 인수를 배열로 모으는데 사용됩니다. 각각은 첫 번째 파라미터와 곱해져 배열로 반환됩니다.</p> +### 나머지 매개변수는 실제 배열, `arguments`는 유사 배열 -<pre class="brush: js">function multiply(multiplier, ...theArgs) { - return theArgs.map(function(element) { - return multiplier * element; - }); -} +나머지 매개변수에서는 {{jsxref("Array")}} 메서드를 사용할 수 있지만, `arguments` 객체에서는 사용할 수 없습니다. -var arr = multiply(2, 1, 2, 3); -console.log(arr); // [2, 4, 6]</pre> +```js +function sortRestArgs(...theArgs) { + let sortedArgs = theArgs.sort() + return sortedArgs +} -<p><code>Array</code> 메소드는 rest 파라미터에서 사용될 수 있지만, <code>arguments</code> 객체에서는 그렇지 않습니다.</p> +console.log(sortRestArgs(5, 3, 7, 1)) // 1, 3, 5, 7 -<pre class="brush: js">function sortRestArgs(...theArgs) { - var sortedArgs = theArgs.sort(); - return sortedArgs; +function sortArguments() { + let sortedArgs = arguments.sort() + return sortedArgs } -console.log(sortRestArgs(5, 3, 7, 1)); // 1, 3, 5, 7 +console.log(sortArguments(5, 3, 7, 1)) +// TypeError 발생 (arguments.sort is not a function) +``` + +`arguments` 객체에 `Array` 메서드를 사용하려면 우선 `arguments`를 실제 배열로 변환해야 합니다. +```js function sortArguments() { - var sortedArgs = arguments.sort(); - return sortedArgs; // this will never happen + let args = Array.from(arguments) + let sortedArgs = args.sort() + return sortedArgs } +console.log(sortArguments(5, 3, 7, 1)) // 1, 3, 5, 7 +``` +## Specifications -console.log(sortArguments(5, 3, 7, 1)); // TypeError (arguments.sort is not a function)</pre> +{{Specifications}} -<p><code>arguments</code> 객체에서 <code>Array</code> 메소드를 사용하려면, 이를 먼저 실제 배열로 변환해야합니다.</p> +## Browser compatibility -<pre class="brush: js">function sortArguments() { - var args = Array.from(arguments); - var sortedArgs = args.sort(); - return sortedArgs; -} -console.log(sortArguments(5, 3, 7, 1)); // 1, 3, 5, 7 -</pre> - -<h2 id="명세">명세</h2> - -<table class="standard-table"> - <tbody> - <tr> - <th scope="col">명세</th> - <th scope="col">상태</th> - <th scope="col">설명</th> - </tr> - <tr> - <td>{{SpecName('ES6', '#sec-function-definitions', 'Function Definitions')}}</td> - <td>{{Spec2('ES6')}}</td> - <td>초기 정의.</td> - </tr> - <tr> - <td>{{SpecName('ESDraft', '#sec-function-definitions', 'Function Definitions')}}</td> - <td>{{Spec2('ESDraft')}}</td> - <td> </td> - </tr> - </tbody> -</table> - -<h2 id="브라우저_호환성">브라우저 호환성</h2> - -<p> </p> - -<p>{{Compat("javascript.functions.rest_parameters")}}</p> - -<h2 id="함께_보기">함께 보기</h2> - -<ul> - <li><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Spread_syntax">Spread 문법</a> (또한 ‘<code>...</code>’)</li> - <li><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/arguments">Arguments 객체</a></li> - <li><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array">Array</a></li> - <li><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions">함수</a></li> - <li><a href="http://wiki.ecmascript.org/doku.php?id=harmony:rest_parameters">Original proposal at ecmascript.org</a></li> - <li><a href="http://javascriptweblog.wordpress.com/2011/01/18/javascripts-arguments-object-and-beyond/">JavaScript arguments object and beyond</a></li> - <li><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment">구조 분해 할당</a></li> -</ul> +{{Compat}} + +## 함께 보기 + +- [전개 구문](/ko/docs/Web/JavaScript/Reference/Operators/Spread_syntax) (같은 '`...`' 사용) +- [구조 분해 할당](/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) +- [`arguments` 객체](/ko/docs/Web/JavaScript/Reference/Functions/arguments) +- {{jsxref("Array")}} |