let array = [0,0,0];
array = [];
C#에서는 Array와 List에 Clear 함수가 있지만, 자바스크립트와 타입스크립트에는 존재하지 않는다.
그래서 자바스크립트에서는 배열을 빈 배열로 초기화할 때는 위와 같이 빈 배열 []로 덮어 씌우면 된다.
그동안 위와 같은 방법을 계속 사용하다가 흥미로운 점을 발견했다.
onLoad() {
let array = [0,0,0];
this.Clear(array);
console.log(array); // [0,0,0]
}
Clear(array: Array<number>) {
array = [];
}
Array 타입은 number와 같은 기본 타입이 아닌 객체 타입이기 때문에
Clear 함수의 매개변수로 전달할 때 Call By Reference (참조 전달)로 전달할 것이고
array의 실제 값이 빈 배열 []로 바뀔 것이라고 예상했다.
하지만 이것은 지나치게 C++이나 C#의 관점이었고, 결과는 원본 배열이 바뀌지 않고 출력됐다.
자바스크립트에는 Call By Value, Call By Reference 외에 Call By Sharing 개념이 존재한다.
onLoad() {
let num = 5;
let item1 = { name: 'None' };
let item2 = { name: 'None' };
this.Change(num, item1, item2);
console.log(num); // 5
console.log(item1); // 'None'
console.log(item2); // 'Sword'
}
Change(num, item1, item2) {
num = num * 2;
item1 = { name: 'Sword' };
item2.name = 'Sword';
}
Change 함수를 보면 num은 number 타입이니까 Call By Value로 원본 값이 바뀌지 않음은 당연하게 여길 수 있다.
그렇지만 item1과 item2는 동일한 객체 타입인데 한쪽만 값이 변했다. 같은 Call By Reference 아닌가?
결론은, 자바스크립트에는 Call By Value만이 존재한다.
그리고 나처럼 C#과 같은 타 언어에서 Call By Value, Call By Reference 개념을 배우고 와서
혼동을 느끼는 사람들 때문에 자바스크립트에선 이 Call By Value를 Call By Sharing이라 부른다.
위의 예시 Change 함수의 매개변수 3개 케이스에 대응하는, Call By Sharing의 특징 3가지가 있다.
(1) 매개변수로 넘어온 객체를 복사하여 지역변수로 사용한다.
(2) 매개변수로 넘어온 객체에 새로운 메모리 주소를 가지는 객체를 새로 할당 불가
(3) 매개변수로 넘어온 객체의 속성은 변경 가능
즉, C#에서는 (2)와 (3)이 모두 가능한 것을 Call By Reference라 불렀는데
자바스크립트의 Call By Reference는 왜 (2)에서 새로 할당이 안 되는 것인지 의문을 가졌던 것이다.
다시 처음으로 돌아와서
특정 배열을 다른 함수의 매개변수로 전달하여 빈 배열로 만들 때,
빈 배열이라는 새로운 객체로 할당하려 했기 때문에 원본 배열이 바뀌지 않은 것이다.
Clear(array: Array<number>) {
array.length = 0;
}
이 경우, (3) 특징을 이용하여 배열의 속성들 중 하나인 length를 0으로 초기화하면 된다.
'JavaScript 기본' 카테고리의 다른 글
Key와 Value 쌍의 컬렉션 (0) | 2023.02.27 |
---|---|
순환 참조 (0) | 2022.10.25 |
함수 리스트 (Delegate) (0) | 2022.04.12 |
Array 함수 #6. 기타 (0) | 2022.03.08 |
Array 함수 #5. sort (0) | 2022.03.03 |