3. 자바스크립트 데이터 타입과 연산자 #3 참조 타입의 특성

2021. 7. 21. 12:45JavaScript/basic

본 글은 INSIDE JAVASCRIPT 도서의 내용을 복습하기 위해 작성된 글입니다.

3.3 참조 타입의 특성

자바스크립트에서는 기본 타입인 숫자, 문자열, 불린값, null, undefined 5가지를 제외한 모든 값은 객체이다. 배열이나 함수 또한 객체로 취급된다. 그리고 이러한 객체는 자바스크립트에서 참조 타입이라고 부른다. 이것은 객체의 모든 연산이 실제 값이 아닌 참조값으로 처리되기 때문이다.

let objA = {
    val : 40
};

let objB = objA;

console.log(objA.val);  // 40
console.log(objB.val);  // 40

objB.val = 50;
console.log(objA.val);  // 50
console.log(objB.val);  // 50

위의 내용에서 objB 변수에 objA 객체를 할당하였다. 이렇게 되면 objB와 objA 객체는 같은 주소에 있는 객체를 가리킨다. 따라서 objB의 val 프로퍼티 값을 변경하면 objA의 val 프로퍼티 값도 변경된다.

3.3.1 객체 비교

동등 연산자(==)를 사용하여 두 객체를 비교할 때도 객체의 프로퍼티 값이 아닌 참조값을 비교한다.

let a = 100;
let b = 100;

let objA = {value:100};
let objB = {value:100};
let objC = objB;

console.log(a==b);          // true
console.log(objA==objB);    // false
console.log(objB==objC);    // true

3.3.2 참조에 의한 함수 호출 방식

타입에 따른 함수 호출 방식

  • 기본 타입 : Call by Value 방식
  • 참조 타입 : Call by Reference 방식

Call by Value 방식

함수를 호출할 때 인자로 기본 타입의 값을 넘길 경우, 호출된 함수의 매개변수로 복사된 값이 전달된다. 때문에 함수 내부에서 매개변수를 이용해 값을 변경해도, 실제로 호출된 변수의 값이 변경되지는 않는다.

 

Call by Reference 방식

함수를 호출할 때 인자로 참조 타입인 객체를 전달할 경우, 객체의 프로퍼티 값이 함수의 매개변수로 복사되지 않고, 인자로 넘긴 객체의 참조값이 그대로 함수 내부로 전달된다. 때문에 함수 내부에서 참조값을 이용해서 인자로 넘긴 실제 객체의 값을 변경할 수 있는 것이다.

 

let a = 100;
let objA = {value:100};

function changeArg(num, obj)
{
    num = 200;
    obj.value = 200;

    console.log(num);   // 200
    console.log(obj);   // obj {value : 200}
}

changeArg(a,objA);

console.log(a);         // 100
console.log(objA);      // objA {value : 200}

 

call by value와 call by reference 동작 차이

References

source code : https://github.com/yonghwankim-dev/javascript_study/tree/main
INSIDE JAVASCRIPT 한빛미디어, 송형주, 고형주 지음