리액트 전개연산자 깊은복사 얕은복사

태민·2022년 11월 14일
0

Spread 전개 연산자

1.깊은복사

깊은복사를 하더라도 그림을 새로 그리지 않을 뿐

연산은 이루어진다 그래서 오래걸린다

그림을 새로 그린다는것은 → 렌더해서 출력한다는 뜻

최적화를 위해서 사용하는 것이니

처음에는 몰라도 된다

어떻게 짜든 죽이되든 밥이되든 실행은 된다

하지만 잘 짜려면 깊은 복사로 짜야한다

최적화를 위해서!

자식을 다시 그려야할지 안그려야할지

자식 b는 a에 의존적이다

상태 데이터를 공유한다는 것은 의존성이 있다는 것

상태 데이터를 공유하지않으면 의존적이지 않다는 것

쉽게 예를들면

어떤 큰 창이 있고 상단에 알림 종 표시가 있고

하단에는 채팅을 쓸 수 있는 칸이 있다고 가정하자

그럼 그 채팅칸은 그 큰창안에 속해있다 = 의존적이다

채팅을 쳐서 엔터를 치면 알림종에 숫자1이뜬다

자식의 변화때문에 부모에도 변화가 생겼다

이것이 바로 의존적이라는 것 !

전에 설명했던 컴포넌트 개념을 다시 불러와서 정리해보면

A안에 B

B안에 C

C안에 D

이렇게 물려있을 때

b를 바꾸면 c,d는 전부 새로 그려진다

단! 의존적일때만 의존적이지않다면 전체가 다시 그려지진 않는다

이게 의존적이라는 것

하지만 주의할점이 다시그려지지 않을 뿐 연산은 이루어진다

왜? 비교를 해봐야하니까 서로 의존적인지 아닌지 연산 후

의존적이면 다시그리고 그렇지 않으면 안그리고

다시말해 연산을 하는 이유는 최적화를 위한 것이다

2.깊은복사와 얕은 복사의 차이
깊은 복사와 얕은 복사의 차이를 알기위해

spread연산자 즉 전개연산자 흩뿌리는 연산자를 활용해보자

test.html파일을 만들어서

바디태그안에 스크립트로 이렇게 묶어서 작성했다

<script>
    //concat, filter, map, slice, spread(전개) 연산자
    const a= [1,2,3];
    const b= [...a];
console.log("1.====================스프레드 연산자");
b.push(4); // 불변이 아닌 b의 데이터 변경
console.log(`a의 값은 : ${a}`)
console.log(`b의 값은 : ${b}`)
</script>

자 보면 우리는 … 스프레드 연산자를 사용해서

const a 는 배열로 1,2,3을 넣었고

const b 는 전개연산자를 통해 a의 배열값인 1,2,3을 그대로 불러왔다

그리고 b.push(4);를 통해서 b안에 전개연산자로 넣은 a의 값에 4를 추가해서

1,2,3,4 를 만들었고

출력하면 a는 1,2,3

b는 1,2,3,4가 나오게 된다

이게 깊은 복사의 원리이다

그렇다면 얕은복사는 무엇일까?

consta= [1,2,3];
constb= a;
console.log("1.====================스프레드 연산자");
b.push(4); // 불변이 아닌 b의 데이터 변경
console.log(`a의 값은 : ${a}`)
console.log(`b의 값은 : ${b}`)

이게 얕은 복사이다

말그대로 복사는했다

a는 배열 1,2,3 이 들어있는데 b = a 이렇게 선언하면

b도 1,2,3 이되고

a 와 b는 같으니까 123 123 같은 수가 나오는데

하단에서 push로 b에 4를 추가했으니 b는 1234 가 된다

이 개념대로면 const b = a 임으로

a도 123 이 아닌 1,2,3,4 가 되어서

출력하면 둘다 1,2,3,4 1,2,3,4 가 된다

얕은복사와 깊은복사의 차이에 대해 간단한 예제를 통해

이해해보았다!

자바에서 배열복사하려면 for문 돌려야하지만

전개연산자로 아주 심플하게 복사가 가능하다!

3.concat 추가

const a2 = [1,2,3];

const b2= a2.concat(4);

이렇게 코드를 짯다고 하면

a2는 그대로 1,2,3

b2는 1,2,3에 4를 추가한 1234가 된다

push와의 차이는 push는 기존 배열을 수정해서 재출력하지만

concat은 기존의 배열은 그대로 두고 새로운 배열에 추가해서 재출력한다

profile
몰입이 즐거운 개발자

0개의 댓글