Skip to content

Commit d8662bd

Browse files
[나머지 매개변수와 스프레드 문법] 개정
1 parent 5cd0780 commit d8662bd

File tree

1 file changed

+58
-58
lines changed
  • 1-js/06-advanced-functions/02-rest-parameters-spread

1 file changed

+58
-58
lines changed
Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 나머지 매개변수와 전개 문법
1+
# 나머지 매개변수와 스프레드 문법
22

33
상당수의 자바스크립트 내장 함수는 인수의 개수에 제약을 두지 않습니다.
44

@@ -8,7 +8,7 @@
88
- `Object.assign(dest, src1, ..., srcN)` -- `src1..N`의 프로퍼티를 `dest`로 복사합니다.
99
- 기타 등등
1010

11-
이번 챕터에서는 이렇게 임의의 수의 인수를 받는 방법에 대해 알아보겠습니다. 또한 함수의 매개변수에 배열을 전달하는 방법에 대해서도 알아보겠습니다.
11+
이번 챕터에서는 이렇게 임의의(정해지지 않은) 수의 인수를 받는 방법에 대해 알아보겠습니다. 또한 함수의 매개변수에 배열을 전달하는 방법에 대해서도 알아보겠습니다.
1212

1313
## 나머지 매개변수 `...`
1414

@@ -25,7 +25,7 @@ alert( sum(1, 2, 3, 4, 5) );
2525

2626
함수를 정의할 땐 인수를 두 개만 받도록 하고, 실제 함수를 호출할 땐 이보다 더 많은 '여분의' 인수를 전달했지만, 에러가 발생하지 않았습니다. 다만 반환 값은 처음 두 개의 인수만을 사용해 계산됩니다.
2727

28-
이렇게 여분의 매개변수는 그 값들을 담을 배열 이름을 마침표 세 개 `...`뒤에 붙여주면 함수 선언부에 포함시킬 수 있습니다. 이때 마침표 세 개 `...`는 "나머지 매개변수들을 한데 모아 배열에 집어넣어라."는 것을 의미합니다.
28+
이렇게 여분의 매개변수는 그 값들을 담을 배열 이름을 마침표 세 개 `...`뒤에 붙여주면 함수 선언부에 포함시킬 수 있습니다. 이때 마침표 세 개 `...`는 "남아있는 매개변수들을 한데 모아 배열에 집어넣어라."는 것을 의미합니다.
2929

3030
아래 예시에선 모든 인수가 배열 `args`에 모입니다.
3131

@@ -43,22 +43,22 @@ alert( sumAll(1, 2) ); // 3
4343
alert( sumAll(1, 2, 3) ); // 6
4444
```
4545

46-
앞부분의 매개변수는 변수로, 그 이외의 매개변수들은 배열로 모을 수도 있습니다.
46+
앞부분의 매개변수는 변수로, 남아있는 매개변수들은 배열로 모을 수도 있습니다.
4747

48-
아래 예시에선 처음 두 인수는 변수에, 나머지 인수들은 `titles`이라는 배열에 할당됩니다.
48+
아래 예시에선 처음 두 인수는 변수에, 나머지 인수들은 `titles`라는 배열에 할당됩니다.
4949

5050
```js run
5151
function showName(firstName, lastName, ...titles) {
52-
alert( firstName + ' ' + lastName ); // Julius Caesar
52+
alert( firstName + ' ' + lastName ); // Bora Lee
5353

5454
// 나머지 인수들은 배열 titles의 요소가 됩니다.
55-
// titles = ["Consul", "Imperator"]
56-
alert( titles[0] ); // Consul
57-
alert( titles[1] ); // Imperator
55+
// titles = ["Software Engineer", "Researcher"]
56+
alert( titles[0] ); // Bora
57+
alert( titles[1] ); // Lee
5858
alert( titles.length ); // 2
5959
}
6060

61-
showName("Julius", "Caesar", "Consul", "Imperator");
61+
showName("Bora", "Lee", "Software Engineer", "Researcher");
6262
```
6363

6464
````warn header="나머지 매개변수는 항상 마지막에 있어야 합니다."
@@ -73,9 +73,9 @@ function f(arg1, ...rest, arg2) { // ...rest 후에 arg2가 있으면 안 됩니
7373
`...rest`는 항상 마지막에 있어야 합니다.
7474
````
7575

76-
## 'arguments' 변수
76+
## arguments 객체
7777

78-
`arguemnts`라는 특별한 유사 배열 객체(array-like object)를 이용하면 인덱스를 사용해 모든 인수에 접근할 수 있습니다.
78+
유사 배열 객체(array-like object)`arguemnts`를 사용하면 인덱스를 사용해 인수에 접근할 수 있습니다.
7979

8080
예시:
8181

@@ -86,25 +86,25 @@ function showName() {
8686
alert( arguments[1] );
8787

8888
// arguments는 이터러블 객체이기 때문에
89-
// for(let arg of arguments) alert(arg); 를 사용해 인수를 나열할 수 있습니다.
89+
// for(let arg of arguments) alert(arg); 를 사용해 인수를 펼칠 수 있습니다.
9090
}
9191

92-
// 2, Julius, Caesar가 출력됨
93-
showName("Julius", "Caesar");
92+
// 2, Bora, Lee가 출력됨
93+
showName("Bora", "Lee");
9494

9595
// 1, Bora, undefined가 출력됨(두 번째 인수는 없음)
9696
showName("Bora");
9797
```
9898

99-
나머지 매개변수는 비교적 최신의 문법입니다. 과거엔 함수의 인수 전체를 얻어내는 방법이 `arguments`를 사용하는 것밖에 없었습니다. 물론 지금도 `arguments`를 사용할 수 있습니다. 오래된 코드를 보다 보면 `arguments`를 만나게 되죠.
99+
나머지 매개변수는 비교적 최신에 나온 문법입니다. 나머지 매개변수가 나오기 이전엔 함수의 인수 전체를 얻어내는 방법이 `arguments`를 사용하는 것밖에 없었습니다. 물론 지금도 `arguments`를 사용할 수 있습니다. 오래된 코드를 보다 보면 `arguments`를 만나게 되죠.
100100

101101
`arguments`는 유사 배열 객체이면서 이터러블(반복 가능한) 객체입니다. 어쨌든 배열은 아니죠. 따라서 배열 메서드를 사용할 수 없다는 단점이 있습니다. `arguments.map (...)`을 호출할 수 없죠.
102102

103103
여기에 더하여 `arguments`는 인수 전체를 담기 때문에 나머지 매개변수처럼 인수의 일부만 사용할 수 없다는 단점도 있습니다.
104104

105-
따라서 배열 메서드를 사용하고 싶거나 인수 일부만 사용하고자 할 때는 나머지 매개변수를 사용하는 것이 좋습니다.
105+
따라서 배열 메서드를 사용하거나 인수 일부만 사용할 때는 나머지 매개변수를 사용하는게 좋습니다.
106106

107-
````smart header="화살표 함수에는 `\'arguments\'`가 없습니다."
107+
````smart header="화살표 함수는 `arguments` 객체를 지원하지 않습니다."
108108
화살표 함수에서 `arguments` 객체에 접근하면, 외부에 있는 '일반' 함수의 arguments 객체를 가져옵니다.
109109

110110
예시:
@@ -118,11 +118,11 @@ function f() {
118118
f(1); // 1
119119
```
120120

121-
앞서 배운 바와 같이 화살표 함수는 자체 `this`를 가지지 않습니다. 여기에 더하여 `arguments` 객체도 없다는 것을 위 예시를 통해 확인해 보았습니다.
121+
앞서 배운 바와 같이 화살표 함수는 자체 `this`를 가지지 않습니다. 여기에 더하여 위 예시를 통해 화살표 함수는 `arguments` 객체를 지원하지 않는다는 것을 확인해 보았습니다.
122122
````
123123
124124
125-
## spread 문법 [#spread-syntax]
125+
## 스프레드 문법 [#spread-syntax]
126126
127127
지금까지 매개변수 목록을 배열로 가져오는 방법에 대해 살펴보았습니다.
128128
@@ -134,7 +134,7 @@ f(1); // 1
134134
alert( Math.max(3, 5, 1) ); // 5
135135
```
136136
137-
배열 `[3, 5, 1]` 있고, 이 배열을 대상으로 `Math.max`를 호출하고 싶다고 가정해봅시다.
137+
배열 `[3, 5, 1]` 있고, 이 배열을 대상으로 `Math.max`를 호출하고 싶다고 가정해봅시다.
138138
139139
아무런 조작 없이 배열을 '있는 그대로' `Math.max`에 넘기면 원하는 대로 동작하지 않습니다. `Math.max`는 배열이 아닌 숫자 목록을 인수로 받기 때문입니다.
140140
@@ -146,18 +146,18 @@ alert( Math.max(arr) ); // NaN
146146
*/!*
147147
```
148148
149-
`Math.max (arr[0], arr[1], arr[2])` 처럼 배열 요소를 수동으로 나열하는 방법도 있긴 한데 배열 길이를 알 수 없을 때는 이마저도 불가능합니다. 스크립트가 돌아갈 때 실제 넘어오는 배열의 길이는 아주 길 수도 있고, 아예 빈 배열일 수도 있기 때문입니다. 수동으로 이걸 다 처리하다 보면 코드가 지저분해지겠죠.
149+
`Math.max (arr[0], arr[1], arr[2])` 처럼 배열 요소를 수동으로 나열하는 방법도 있긴 한데, 배열 길이를 알 수 없을 때는 이마저도 불가능합니다. 스크립트가 돌아갈 때 실제 넘어오는 배열의 길이는 아주 길 수도 있고, 아예 빈 배열일 수도 있기 때문입니다. 수동으로 이걸 다 처리하다 보면 코드가 지저분해지겠죠.
150150
151-
*전개 문법(spread syntax)* 은 이럴 때 사용하기 위해 만들어졌습니다. `...`를 사용하기 때문에 나머지 매개변수와 비슷해 보이지만, 전개 문법은 나머지 매개변수와 반대의 역할을 합니다.
151+
*스프레드 문법(spread syntax)* 은 이럴 때 사용하기 위해 만들어졌습니다. `...`를 사용하기 때문에 나머지 매개변수와 비슷해 보이지만, 스프레드 문법은 나머지 매개변수와 반대되는 역할을 합니다.
152152
153-
함수를 호출할 때 `... arr`를 사용하면, 이터러블 객체 `arr`이 인수 목록으로 '확장'됩니다.
153+
함수를 호출할 때 `...arr`를 사용하면, 이터러블 객체 `arr`이 인수 목록으로 '확장'됩니다.
154154
155155
`Math.max`를 사용한 예시로 다시 돌아가 봅시다.
156156
157157
```js run
158158
let arr = [3, 5, 1];
159159
160-
alert( Math.max(...arr) ); // 5 (전개 문법이 배열을 인수 목록으로 바꿔주었습니다.)
160+
alert( Math.max(...arr) ); // 5 (스프레드 문법이 배열을 인수 목록으로 바꿔주었습니다.)
161161
```
162162
163163
아래와 같이 이터러블 객체 여러 개를 전달하는 것도 가능합니다.
@@ -169,7 +169,7 @@ let arr2 = [8, 3, -8, 1];
169169
alert( Math.max(...arr1, ...arr2) ); // 8
170170
```
171171
172-
전개 문법을 평범한 값과 혼합해 사용하는 것도 가능하죠.
172+
스프레드 문법을 평범한 값과 혼합해 사용하는 것도 가능하죠.
173173
174174
175175
```js run
@@ -179,7 +179,7 @@ let arr2 = [8, 3, -8, 1];
179179
alert( Math.max(1, ...arr1, 2, ...arr2, 25) ); // 25
180180
```
181181
182-
배열을 합칠 때 전개 문법을 활용할 수도 있습니다.
182+
스프레드 문법은 배열을 합칠 때도 활용할 있습니다.
183183
184184
```js run
185185
let arr = [3, 5, 1];
@@ -192,21 +192,21 @@ let merged = [0, ...arr, 2, ...arr2];
192192
alert(merged); // 0,3,5,1,2,8,9,15 (0, arr, 2, arr2 순서로 합쳐집니다.)
193193
```
194194
195-
앞선 예시들에선 배열을 대상으로 전개 문법이 어떻게 동작하는지 살펴보았습니다. 그런데 배열이 아니더라도 이터러블 객체이면 전개 문법을 사용할 수 있습니다.
195+
앞선 예시들에선 '배열'을 대상으로 스프레드 문법이 어떻게 동작하는지 살펴보았습니다. 그런데 배열이 아니더라도 이터러블 객체이면 스프레드 문법을 사용할 수 있습니다.
196196
197-
전개 문법을 사용해 문자열을 문자 배열로 변환 시켜 보겠습니다.
197+
스프레드 문법을 사용해 문자열을 문자 배열로 변환 시켜 보겠습니다.
198198
199199
```js run
200200
let str = "Hello";
201201
202202
alert( [...str] ); // H,e,l,l,o
203203
```
204204
205-
전개 문법은 `for..of`와 같은 방식으로 내부에서 iterator(반복자)를 사용해 요소를 수집합니다.
205+
스프레드 문법은 `for..of`와 같은 방식으로 내부에서 이터레이터(iterator, 반복자)를 사용해 요소를 수집합니다.
206206
207-
문자열에 `for..of`를 사용하면 문자열을 구성하는 문자가 반환됩니다. `...str`도 `"H","e","l","l","o"`가 되는데, 이 문자 목록은 배열 초기자(array initializer) `[...str]`로 전달됩니다.
207+
문자열에 `for..of`를 사용하면 문자열을 구성하는 문자가 반환됩니다. `...str`도 `H,e,l,l,o`가 되는데, 이 문자 목록은 배열 초기자(array initializer) `[...str]`로 전달됩니다.
208208
209-
메서드 `Array.from`은 문자열 같은 이터러블 객체를 배열로 바꿔주기 때문에 `Array.from`을 사용해도 동일한 작업을 할 수 있습니다.
209+
메서드 `Array.from`은 이터러블 객체인 문자열을 배열로 바꿔주기 때문에 `Array.from`을 사용해도 동일한 작업을 할 수 있습니다.
210210
211211
```js run
212212
let str = "Hello";
@@ -215,75 +215,75 @@ let str = "Hello";
215215
alert( Array.from(str) ); // H,e,l,l,o
216216
```
217217
218-
`[...str]` 동일한 결과가 출력되는 것을 확인할 수 있습니다.
218+
`[...str]` 동일한 결과가 출력되는 것을 확인할 수 있네요.
219219
220-
그런데 `Array.from(obj)`와 `[...obj]`에는 다음과 같은 미묘한 차이가 있습니다.
220+
그런데 `Array.from(obj)`와 `[...obj]` 다음과 같은 미묘한 차이가 있습니다.
221221
222222
- `Array.from`은 유사 배열 객체와 이터러블 객체 둘 다에 사용할 수 있습니다.
223-
- 전개 문법은 이터러블 객체에만 사용할 수 있습니다.
223+
- 스프레드 문법은 이터러블 객체에만 사용할 수 있습니다.
224224
225-
이런 이유때문에 무언가를 배열로 바꿀 때는 전개 문법보다 `Array.from`이 보편적으로 사용됩니다.
225+
이런 이유때문에 무언가를 배열로 바꿀 때는 스프레드 문법보다 `Array.from`이 보편적으로 사용됩니다.
226226
227227
228-
## Get a new copy of an array/object
228+
## 배열과 객체의 복사본 만들기
229229
230-
Remember when we talked about `Object.assign()` [in the past](info:object-copy#cloning-and-merging-object-assign)?
230+
`Object.assign()` [참조에 의한 객체 복사](info:object-copy#cloning-and-merging-object-assign) 챕터에서 `Object.assign()`을 사용해 객체를 복사한 예시를 떠올려봅시다.
231231
232-
It is possible to do the same thing with the spread syntax.
232+
`Object.assign()` 말고도 스프레드 문법을 사용하면 배열과 객체를 복사할 수 있습니다.
233233
234234
```js run
235235
let arr = [1, 2, 3];
236-
let arrCopy = [...arr]; // spread the array into a list of parameters
237-
// then put the result into a new array
236+
let arrCopy = [...arr]; // 배열을 펼쳐서 각 요소를 분리후, 매개변수 목록으로 만든 다음에
237+
// 매개변수 목록을 새로운 배열에 할당함
238238
239-
// do the arrays have the same contents?
239+
// 배열 복사본의 요소가 기존 배열 요소와 진짜 같을까요?
240240
alert(JSON.stringify(arr) === JSON.stringify(arrCopy)); // true
241241
242-
// are the arrays equal?
243-
alert(arr === arrCopy); // false (not same reference)
242+
// 두 배열은 같을까요?
243+
alert(arr === arrCopy); // false (참조가 다름)
244244
245-
// modifying our initial array does not modify the copy:
245+
// 참조가 다르므로 기존 배열을 수정해도 복사본은 영향을 받지 않습니다.
246246
arr.push(4);
247247
alert(arr); // 1, 2, 3, 4
248248
alert(arrCopy); // 1, 2, 3
249249
```
250250
251-
Note that it is possible to do the same thing to make a copy of an object:
251+
이번엔 객체를 복사하는 예시를 살펴보겠습니다.
252252
253253
```js run
254254
let obj = { a: 1, b: 2, c: 3 };
255-
let objCopy = { ...obj }; // spread the object into a list of parameters
256-
// then return the result in a new object
255+
let objCopy = { ...obj }; // 객체를 펼쳐서 각 요소를 분리후, 매개변수 목록으로 만든 다음에
256+
// 매개변수 목록을 새로운 객체에 할당함
257257
258-
// do the objects have the same contents?
258+
// 객체 복사본의 프로퍼티들이 기존 객체의 프로퍼티들과 진짜 같을까요?
259259
alert(JSON.stringify(obj) === JSON.stringify(objCopy)); // true
260260
261-
// are the objects equal?
262-
alert(obj === objCopy); // false (not same reference)
261+
// 두 객체는 같을까요?
262+
alert(obj === objCopy); // false (참조가 다름)
263263
264-
// modifying our initial object does not modify the copy:
264+
// 참조가 다르므로 기존 객체를 수정해도 복사본은 영향을 받지 않습니다.
265265
obj.d = 4;
266266
alert(JSON.stringify(obj)); // {"a":1,"b":2,"c":3,"d":4}
267267
alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3}
268268
```
269269
270-
This way of copying an object is much shorter than `let objCopy = Object.assign({}, obj);` or for an array `let arrCopy = Object.assign([], arr);` so we prefer to use it whenever we can.
270+
이렇게 스프레드 문법을 사용하면 `let objCopy = Object.assign({}, obj);`, `let arrCopy = Object.assign([], arr);`보다 더 짧은 코드로 배열이나 객체를 복사할 수 있어서 사람들은 이 방법을 선호하는 편입니다.
271271
272272
273273
## 요약
274274
275-
`"..."`은 나머지 매개변수나 전개 문법으로 사용됩니다.
275+
`"..."`은 나머지 매개변수나 스프레드 문법으로 사용할 수 있습니다.
276276
277-
나머지 매개변수와 전개 문법은 아래의 방법으로 구분할 수 있습니다.
277+
나머지 매개변수와 스프레드 문법은 아래의 방법으로 구분할 수 있습니다.
278278
279279
- `...`이 함수 매개변수의 끝에 있으면 인수 목록의 나머지를 배열로 모아주는 '나머지 매개변수'입니다.
280-
- `...`이 함수 호출 시 사용되면 배열을 목록으로 확장해주는 '전개 문법'입니다.
280+
- `...`이 함수 호출 시 사용되거나 기타 경우엔 배열을 목록으로 확장해주는 '스프레드 문법'입니다.
281281
282282
사용 패턴:
283283
284284
- 인수 개수에 제한이 없는 함수를 만들 때 나머지 매개변수를 사용합니다.
285-
- 다수의 인수를 받는 함수에 배열을 전달할 때 전개 문법을 사용합니다.
285+
- 다수의 인수를 받는 함수에 배열을 전달할 때 스프레드 문법을 사용합니다.
286286
287287
둘을 함께 사용하면 매개변수 목록과 배열 간 전환을 쉽게 할 수 있습니다.
288288
289-
조금 오래된 방법이긴 하지만 `arguments`라는 반복 가능한 유사 배열 객체를 사용해도 인수 모두를 사용할 수 있습니다.
289+
조금 오래된 방법이긴 하지만 `arguments`라는 반복 가능한(이터러블) 유사 배열 객체를 사용해도 인수 모두를 사용할 수 있습니다.

0 commit comments

Comments
 (0)