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 |