비밀번호

커뮤니티2

  • 맑음속초-8.3맑음북춘천-12.1맑음철원-12.5맑음동두천-12.2맑음파주-13.4맑음대관령-16.1맑음춘천-11.0맑음백령도-8.1맑음북강릉-8.7맑음강릉-7.6맑음동해-7.2맑음서울-10.6맑음인천-10.3맑음원주-10.6눈울릉도-3.9맑음수원-10.3맑음영월-10.7맑음충주-9.7구름많음서산-7.9맑음울진-7.2맑음청주-9.3구름많음대전-8.5맑음추풍령-9.7맑음안동-8.9맑음상주-8.4맑음포항-6.0맑음군산-7.8맑음대구-6.2맑음전주-8.1맑음울산-6.2맑음창원-5.3구름많음광주-6.1맑음부산-5.1맑음통영-4.8눈목포-4.3맑음여수-5.8구름많음흑산도-2.5흐림완도-3.3구름많음고창-5.7구름많음순천-7.7눈홍성-8.3맑음서청주-9.9눈제주0.2구름많음고산-0.7흐림성산-1.9눈서귀포-1.3맑음진주-5.4맑음강화-10.4맑음양평-9.8맑음이천-10.6맑음인제-11.0맑음홍천-10.7맑음태백-13.6맑음정선군-11.5맑음제천-10.7맑음보은-9.0맑음천안-9.8구름많음보령-7.3구름많음부여-7.7맑음금산-8.2구름많음세종-8.9구름많음부안-7.1맑음임실-7.9흐림정읍-7.4구름많음남원-7.5구름많음장수-10.0흐림고창군-7.0구름많음영광군-5.0맑음김해시-6.0구름많음순창군-7.2맑음북창원-5.1맑음양산시-4.2구름많음보성군-5.7흐림강진군-4.2구름많음장흥-5.6흐림해남-3.9맑음고흥-5.4맑음의령군-6.8맑음함양군-6.8맑음광양시-6.5흐림진도군-3.6맑음봉화-11.1맑음영주-9.5맑음문경-9.3맑음청송군-9.6맑음영덕-7.4맑음의성-7.5맑음구미-7.2맑음영천-7.1맑음경주시-6.4맑음거창-8.1맑음합천-5.0맑음밀양-5.6맑음산청-6.8맑음거제-4.2맑음남해-4.2맑음북부산-5.1
  • 2026.02.08(일)

구글태그매니저[Google Tag Manager] 구글태그매니저 커뮤니티입니다.

[JavaScript] 얕은 복사와 깊은 복사

자바스크립트에도 원본 객체와 같은 참조값을 공유하는 얕은 복사와 원본 객체와 같은 참조값을 공유하지않는 깊은 복사가 존재합니다.

먼저 자바스크립트 변수 자료형에는 원시형(Primitive value 또는 Primitive data type)

string

number

bigint

boolean

undefined

symbol

null

참조형(Reference value 또는 Reference data type)이 존재합니다.

array

object

function

data

얕은 복사는 복사한 변수들끼리 서로를 참조하고 있기 때문에, 하나의 값을 변경하면 전부 다 같이 변경됩니다.

깊은 복사는 복사한 변수들끼리 서로를 참조하지 않기 때문에, 하나의 값을 변경해도 그 변수만 값이 변경됩니다.

참조형 변수를 복사할 때 무심코 얕은 복사를 한 후, 변수 안의 값을 변경하면,
원본 변수 포함 모든 참조형변수의 값이 변경되는 원치 않는 상황이 발생할 수도 있습니다.

필요한 상황에 맞춰 복사 방법을 사용하여 원치않는 상황을 피할 수 있도록 합니다.

제일 중요한 건 복사 하고자 하는 값이 참조형이냐 아니냐에 따라 얕은 복사, 깊은 복사가 결정됩니다.

let a1 = [0, 1, 2];
let a2 = a1;
let a3 = [...a1];

위와 같은 경우 a2는 얕은 복사가 되어 a2의 원소값을 변경하면 a1도 변경됩니다.
하지만 a3는 전개 연산자(...)를 통해 원시 자료형의 숫자(Number)들이 전개되어 복사 했기 때문에 깊은 복사가 이루어져, a3의 원소값을 변경해도 a1은 변하지 않습니다.


let a1 = [[0], [1], [2]];
let a2 = a1;
let a3 = [...a1];

위와 같은 경우 a2는 얕은 복사가 되어 a2의 원소값을 변경하면 a1도 변경됩니다.
a3는 전개 연산자(...)를 통해 참조 자료형인 배열(Array)들이 전개되어 복사 했기 때문에 얕은 복사가 이루어져, a3의 원소값을 변경하면 a1도 변합니다.

객체 복사 함수들(concat, slice, assign 등)을 사용하여도 얕은 복사가 이루어집니다.


얕은 복사를 피해 무조건 깊은 복사를 하는 방법을 알아봅시다.

1. 함수 만들기

위에서 얕은 복사와 깊은 복사의 차이를 알게 되었습니다.
typeof 를 이용하여 배열 또는 객체 변수를 인자로 받았을 때, 각 원소 값들의 자료형을 typeof로 확인하여 참조형인 경우에는 안쪽에 원시값이 나올때까지 접근하여 복사하는 방식의 함수를 만들어 사용할 수 있습니다.
이 방법은 비추천합니다.

2. 외부 라이브러리 사용하기

lodash, fast-copy 등 여러가지 깊은 복사 라이브러리를 사용하는 방식입니다.
외부 라이브러리를 사용할 수 있는 환경이시라면 이 방법을 추천합니다.

3. JSON.parse(JSON.stringify())

참조형 변수의 값을 통째로 문자열로 변경한 후 다시 파싱을 통하여 참조형 변수로 만들기 때문에 깊은 복사가 됩니다.
변수의 원소값들이 단순히 원시자료형이라면 문제가 없지만, 만일 원소 값이 참조형 중 function, data 같은 특수한 경우라면 해당 방법을 사용했을 때 오류가 발생할 수 있습니다.
간단한 변수를 복사하는데 사용한다면 추천하지만, 일반적으로 추천하지 않는 방법입니다.

4. structuredClone()

원본 변수를 인자로 넣고 반환값으로 복사할 변수에 대입하면 되는 기본 제공 함수입니다.
라이브러를 따로 설치하지 않아도 되고, 3번 방식의 단점도 해결되는 아주 좋은 깊은 복사 방법입니다.
브라우저의 버전(22년 이후 버전)만 맞는다면 해당 기능을 가장 추천합니다.(참조 url)

자바스크립트의 변수 자료형(원시형, 참조형)과 해당 변수들을 복사했을 때 발생하는 얕은 복사와 깊은 복사에 대해 정리가 잘 된다면 변수 관리할 때 불편함이 없을 것 입니다.

전체댓글0

검색결과는 총 13건 입니다.    글쓰기
1