╱╱╭╮╱╱╱╱╱╱╭━━━╮╱╱╱╭╮╱╭╮╱╱╱╱╱╱ ╱╱┃┃╱╱╱╱╱╱┃╭━╮┃╱╱╱┃┃╱┃┃╱╱╱╱╱╱ ╱╱┃┣━━┳━━╮┃┃╱┃┣━╮╱┃╰━╯┣━━┳━╮╱ ╭╮┃┃╭╮┃┃━┫┃╰━╯┃╭╮╮┃╭━╮┃╭╮┃╭╮╮ ┃╰╯┃╭╮┃┃━┫┃╭━╮┃┃┃┃┃┃╱┃┃╭╮┃┃┃┃ ╰━━┻╯╰┻━━╯╰╯╱╰┻╯╰╯╰╯╱╰┻╯╰┻╯╰╯

Javascript/Javascript 기초

[Javascript] Spread, Rest 연산자 (...)

재안안 2022. 6. 13. 06:00

Spread

 

Spread는 반복가능한 객체(Iterables)에서 요소들을 바로 Key-Value의 형태로 만들어서 사용하게 해주는 문법이다.

Iterable의 요소들을에 대한 접근이 훤씬 용이하다. 

 

Spread
Console

위의 출력문은 배열의 형태로, 아래의 출력문은 값이 바로 출력된 것을 알 수 있다.

 

...arr 이 짧은 코드가 arr의 요소들을 Key-Value의 형태로 바꾸어서  요소들에 바로 접근한 것이다.

원래 배열의 요소에 접근하려면 인덱스를 사용해야하지만 인덱스를 사용하지 않고도 바로 접근할 수 있는 것이다.

 

배열(반복 가능 객체)의 모든 요소들에 대한 Key-Value의 쌍을 만드니 배열을 모든 요소를 배열에서 꺼낸것과 같이 사용할 수 있다.

 

요소에 대한 직접적인(?) 접근이 가능하니 활용할 수 있는 방법이 많다.

 

Spread 2
Console

arr의 요소들과 arr2의 요소들을 통해서 새로운 배열 arr3을 만들었다.

물론 새로운 배열 arr3의 요소들에게도 Spread 연산자를 통해 바로 접근할 수 있다.

 

이처럼 Spread 연산자를 잘 활용하면 기존의 배열 함수(Push, Concat)을 쓰지 않아도 된다. 훨씬 간편하다.

 

Spread은 Object에서도 사용이 가능하다.

 

Spread 3
Console

익숙한 예제가 보인다 그리고 콘솔창에는 출력된 user 객체의 구조가 보인다.

 

user 객체는  usercode:1, username: "jaean"이라는 Key-Value를 가지고 있지만 내부객체(UserMst or UserDtl)는 보이지 않는다. 위에서 배열 두개를 합칠 때와 비슷하다.

 

Spread를 통해 Object에서도 요소들에 대한 직접적인(?) 접근이 가능하다.

 

UserMst와 UserDtl의 요소들을 통해 Key-Value를 만들고 이를 user객체 안에 넣은 것이다.

 

Spread 4
Console

Spread를 통해 구조 분해도 된다.

보통 구조 분해를 할 때 하나의 변수에는 하나의 값이 들어갔었지만 ( const {username, usercode} = user; )

Rest연산자를 사용하면 하나의 변수에 모든 값을 담을 수 있다.

 

말 그대로 user객체가 복제 되었다.

 

Spread 5
Console

둘은 서로 완전히 다른 객체인 것을 확인 할 수 있다.

사실 당연한 소리다. 요소들을 통해 새로운 객체를 만들었으니

 

이때 조건을 걸 수도 있다.

 

Spread 6
Console

해당 예제에서 true와 false가 보일 것이다.

true일 경우 오른쪽 값이 추가가 되고 false일 경우 추가되지 않는다

false일 경우 오른쪽에 있는 요소에 대한 Key-Value는 생성조차 되지 않는다.

 

userMst의 요소들을 불러온 후 논리연산에서 결과가 true이니 요소들의 Key-Value들이 user2에 추가가 된 것이다.

 

userDtl의 요소들을 불러온 후 논리연산에서 결과가 false가 되니 해당 실행문은 거짓이 되어 요소들의 Key-Value는 user2에 추가되지 않았다.

 

이때 활용을 위해선 true와 false의 자리엔 조건식이 오면 된다.

 

Rest

 

Rest도 동일하게 ...을 사용한다.

그런데 여기서 Spread와 Rest의 차이점을 한번 집고 가야겠다.

 

Spread는 말 그대로 어떠한 객체를 spread해서 요소들에 대한 Key-Value를 만들지만

 

Rest는 요소들을 하나로 contract 한다. 여러개의 요소들로 하나의 배열을 만든다.

Rest는 함수의 매개 변수부분에서만 사용할 수 있다.

 

그냥 ...이 함수의 매개변수 부분에 있으면 이 함수는 매개변수를 무한대로 받을 수 있다고만 생각해도 된다.

 

Rest
Console

testRest에 몇개의 인수를 넣든 상관이 모두 그대로 출력된다.

이때 rest를 출력했더니 testRest에 들어간 모든 인수들이 하나의 배열로 묶여있는 것을 확인 할 수 있다.

 

Rest vs. Spread
Console

Rest를 통해 모든 인수들을 하나의 배열로 만들고 Spread를 통해 또 해당 배열의 요소를 바로 출력했다.

사실 잘 쓰기만 하면 된다. 쓰다보면 저절로 외워질 테니까

 

함수의 모든 인수들을 꼭 하나의 배열에만 넣어야하는 것은 아니다.

 

Rest 2
Console

첫번째 요소는 firstEl, 두번째 요소는 secondEl에서 받고 나머지는 다 rest에서 받는다.

이때 주의해야할 점으로 rest는 항상 뒤에 있어야한다는 점이다. rest가 앞에 올 수는 없다.

 

파이썬의 function example(arg1, arg2, *args); 라고 생각하면 된다.

 

Rest 3
Console

위의 예제와 똑같은 코드인데 Rest부분을 return으로 넘겨서 출력한 것이다.

 

이제 Spread와 Rest를 활용해 보겠다.

 

user object
Example 1
Console

user 객체에 Spread를 사용한 것이다. 그리고 destucturing의 기본값을 사용하였다.

 

Example 2
Console

removeUsercode는 중첩함수이다. 첫번째 함수의 인수로 newUser의 요소들을 넘겨주었고 이때 usercode가 날아갔다.

다음 내부함수의 인수인 "재안"은 nameKR의 값으로 사용되어 nameKR, username, password의 object를 만들었다.

만들어진 object는 newUser2에 저장되었다.