본문 바로가기

프로그래밍

Javascript 값 복사 (copy value)

728x90

고급 프로그래밍 언어에서는 일반적인 할당으로는 atomic 타입이 아닌 경우 명시하지 않는 이상 참조 복사를 수행한다.

간단하게 전역으로 선언된 값에 1을 더해서 출력하는 코드를 작성해보자.

let orgVal = {
  "data": 0
};

function foo(){
  let val = orgVal;
  val.data = val.data + 1;
    console.log(val);
  console.log(orgVal);
}

foo();

위의 코드는 참조 복사 코드이다. foo 함수를 호출해서 orgVal 이 담고 있는 data 의 값에 1을 더해서 출력한다. 의도에 부합한다.

하지만 반복적으로 foo 함수를 호출한다면 이야기가 달라진다. orgVal 의 데이터가 참조되고 있기 때문에 호출횟수만큼 orgVal의 data 는 증가하게 된다. 만약 orgVal 은 변하지 않고 호출시에만 1을 더해야 하는 것이라면 이 코드는 오류를 생성하고 있는 것이다. 따라서 아래와 같이 코드를 수정해야 한다.

let orgVal = {
  "data": 0
};

function foo(){
  let val = Object.assign({}, orgVal);;
  val.data = val.data + 1;
  console.log(val);
  console.log(orgVal);
}

foo();
for(let i = 0; i< 10; i++){
  foo();
}

값 복사에 사용하는 Object.assign 함수는 원래 첫 인자의 객체에 후행 객체들의 값을 병합하는 함수다. 이를 응용하여 첫 인자에 새로운 객체를 넣고 후행 객체로 원본 데이터를 넣으면 새로운 객체를 반환 받음으로써 값 복사를 수행한다. 당연히 함수의 첫 인자로 이미 존재하는 객체를 전달할 경우 참조 복사가 이루어지니, 반드시 첫 인자는 새로운 객체를 넣도록 주의를 기울인다.

반응형

'프로그래밍' 카테고리의 다른 글

Object Calisthenics  (0) 2021.03.02
TDD and BDD  (0) 2021.03.02
Blazor  (0) 2021.03.02
Mysql 과 java 데이터 타입 비교  (0) 2021.03.02
C# 현재 디렉터리 경로 얻기  (0) 2021.03.02