Value Types & Reference Types

Sangwook Park·2022년 2월 1일
0

해당 시리즈는 Leonardomso의 33 Concepts Every JavaScript Developer Should Know 를 보고 공부, 정리한 시리즈이며, 자세한 내용은 링크를 확인하길 바란다.

Value Type 과 Reference Type

자바스크립트에서 가장 기초적이지만, 한편으로 가장 헷갈리는 개념 중 하나이다.

명확하게 이해하고 넘어갈 수 있도록 해보자!

먼저 간단하게 정의를 하고 가자면,

Value Type 은 값이 복사되어서 전달되는 데이터 타입을, Reference Type 은 값이 아닌 참조 값(메모리 주소)이 복사되어 전달되는 데이터 타입을 가리킨다.

Value Type 과 Reference Type 의 차이를 보여줄 때 많이 예시를 드는 코드들을 보자.

let a = 10
let b = a

a = 5

console.log(b)

위 코드에서 출력값이 어떻게 될까? 5 일까? 10 일까?

정답은 10 이다.

const person1 = {
    name: 'park'
}
const person2 = person1

person1.name = 'choi'

console.log(person2.name)

위 코드에서의 출력값이 어떻게 될까?

정답는 'choi' 이다

이 2 가지 코드의 차이가 Value Type 과 Reference Type 의 차이를 잘 보여주는 대표적인 예시이다.

그럼 이러한 결과가 왜 나오는지 차근차근 알아가보자

++ 추가적으로 Mutable 과 Immutable 의 개념도 같이 조금 겉들여서 알아가자


Value Type

먼저 Value Type 에 대해서 알아보자

Value Type 은 값이 복사되어 새로운 변수에 전달되는 데이터 타입으로,
앞 장에서 본 원시 타입을 가리킨다.

정의

간단하게 정의를 해보자면,

할당된 메모리 공간(변수)에 실제 값이 저장되는 데이터 타입이다.

라고 할 수 있다.

앞 장에서 본 원시 타입이 Value Type 이다.

특징

  • 변경 불가능한 값이다 (Immutable 하다)
  • 원본의 원시 값이 복사되어 전달된다. 대개 값에 의한 전달 (pass by value) 라고 한다.

코드

앞서 예로 들었던 코드를 한 번 살펴 보자.

let a = 10;
let b = a;

a = 5;

console.log(b); // 출력 : 10

위 코드의 출력 값은 10이다. b 는 할당 받은 a 변수의 값이 5 로 바뀌었는데 왜 그럴까?

이는 앞서 언급한 값에 의한 전달 이라는 특징 때문이다.

변수 a, b 에 할당되어 있는 값들은 number 타입으로 모두 원시 타입(=Value Type) 이다.

그렇기에 원시 값 자체가 복사되어서 전달된다.

값 자체가 복사되어 전달된다. 라는 말이 쉽게 안 와닿을 수 있다.

아래 그림을 보면서 다시 얘기해보자.

Value Type 그림 1

  1. 가장 먼저 a 라는 변수명을 가진 통해서 메모리 공간에 10 이라는 number 값을 할당하였다.

Value Type 그림 2

  1. 다음 b 라는 변수명을 가진 메모리 공간에 a 의 값을 할당한다.

    이 때! b 라는 변수명을 가진 메모리 공간은 a 와 별개이며 a 의 number 값인 10 이 그대로 복사되어 새로운 메모리 공간에 할당된다.

    그렇기에 a 변수와 b 변수에 할당된 number 값인 10 으로 동일하지만, 다른 메모리 공간에 저장된 별개의 값이다.

Value Type 그림 3

  1. 마지막으로 a 라는 변수에 5 라는 number 값을 재할당한다.

    이 때 보면, 기존에 갖고 있던 메모리 공간은 그대로 둔 채 새로운 메모리 공간에 5 라는 number 값을 갖는다.

    이렇게 처리되는 핵심적인 이유는 원시 값은 변경 불가능(Immutable)한 값이기 때문이다.

    헷갈리지 말아야 하는 것이 원시 값 자체를 변경할 수 없다는 것이지 변수 값을 변경할 수 없다는 것은 아니다!!

    변수는 메모리 공간을 가리키면 이름일 뿐이기에 값을 재할당할 수 있다. (재할당이 안되는 변수는 const 이다. )

    만약 변경 가능하다면 아래와 같이 처리가 될 것이다.
    Value Type 그림 4



Reference Type

Reference Type 은 참조 값이 복사되어 새로운 변수에 전달되는 데이터 타입으로,
앞 장에서 본 객체 타입을 가리킨다.

정의

Reference Type 도 간단하게 정의를 해보자면,

할당된 메모리 공간(변수)에 참조 값이 저장되는 데이터 타입이다.

라고 할 수 있다.

대표적으로 객체, 배열, 함수 등이 있다.

특징

  • 변경 가능한 값이다 (Mutable 하다)
  • 참조 값이 복사되어 전달된다. 대개 참조에 의한 전달 (pass by reference) 라고 한다.

코드

앞서 예로 들었던 코드를 한 번 살펴 보자.

const person1 = {
    name: 'park'
}
const person2 = person1

person1.name = 'choi'

console.log(person2.name) // 출력 : 'choi'

위 코드의 출력 값은 'choi' 다. 왜 person1 의 name 값을 변경했는데 person2 의 name 값이 변경되었을까?

이는 객체 타입의 경우 참조에 의한 전달을 하기 때문이다.

값에 의한 전달과 다르게 참조에 의한 전달은 윈시 값 자체가 아닌 참조 값을 전달한다.

참조 값이란 객체가 실제로 저장된 공간을 가리키는 메모리 주소 값을 의미한다.

즉, 값 자체가 아니라 메모리 주소 값을 전달한다는 것이다.

아래 그림을 보면서 좀 더 살펴 보자.

Reference Type 그림 1

그림에서 볼 수 있는 것처럼 person1 이라는 변수가 갖는 메모리 공간에는 객체 값이 아닌 객체 값이 할당되어 있는 메모리 주소의 값, 참조 값이 할당되어 있다는 것을 볼 수 있다.

그럼 이어 위 코드를 그린 그림을 보자.

Reference Type 그림 2

  1. 먼저, person1 이라는 변수을 초기화하는 과정에서 person1 의 메모리 공간에 객체의 주소가 할당된다.

  2. 다음 person2 의 메모리 공간에 person1 가 갖고 있는 참조 값이 복사되어 전달된다.

    이 때, person2 에는 person1 의 참조 값이 할당되기에 동일한 참조 값을 갖는다.

    다만, 각 변수의 메모리 주소가 다르기에 저장된 공간이 다르다.

Reference Type 그림 3

  1. 위처럼 person1 의 name 값을 변경하려고 한다면, 새로운 객체를 만들어서 다른 메모리 공간에 할당하는 것이 아닌 person1 이 갖고 있는 참조 값에 있는 객체가 변경된다.

    이는 앞서 새로운 메모리 주소에 값을 할당했던 Value Type 과 다르다.

    그 이유는, Reference Type 은 변경이 가능(Mutable)한 타입이기 때문이다.

    이처럼 객체를 할당한 변수는 재할당 없이 객체를 변경하거나 동적을 프로퍼티를 추가하거나, 삭제할 수 있다.

    이로 인해, person1person2 가 가리키고 있는 동일한 객체가 변경되었기 때문에 person1 의 name 값과 person2 의 name 값이 같다.

    console.log(person1.name === person2.name) // true

++

참조 값을 전달하기에 갖는 당연하지만, 재밌는 특징이 있다.

const x = {
  color: 'blue'
}

const y = {
  color: 'blue'
}

console.log(x === y) // false
console.log(x.color === y.color) // true

위 코드에서 console.log(x === y) 의 출력값은 false 이다.

  • x 와 y 에는 같은 프로퍼티(color)와 프로퍼티 값(blue)를 갖고 있는 객체를 선언했다.
  • 두 객체 내부의 값은 같더라도 서로 다른 메모리 공간에 저장되어 있다.
  • x 와 y 는 객체 각각의 다른 참조 값을 갖고 있기에 두 변수를 비교했을 때, 같지 않은 것이다.

반면에 console.log(x.color === y.color) 의 출력값은 true 이다.

  • x.color 와 y.color 에 저장되어 있는 것은 blue 라는 원시 값이기에 서로 같다.



Value Type 과 Reference Type 비교

간단하게 비교를 해보면서 정리를 하자

Value TypeReference Type
종류원시 타입 (Number, String, Boolean 등등)객체 타입 (객체, 배열 등)
전달하는 값값 자체 (Value)참조 값 (메모리 주소 )
변경 가능성X (Immutable)O (Mutable)

+ 추가적으로

모두 값에 의한 전달, 참조에 의한 전달 이라고 하지만 사실 생각해보면 모두 전달할 때 값을 전달한다.

그 값이 실제 값 그 자체인지, 아니면 참조 값인지에 대한 차이일 뿐이다.



정리

Value Type 은 값이 복사되어서 전달되는 데이터 타입이며, 원시 타입을 가리킨다.

Value Type변경 불가능한(Immutable) 값이며, 변수에 실제 값이 할당된다.

Reference Type 은 값이 아닌 참조 값(메모리 주소)이 복사되어 전달되는 데이터 타입이며, 객체 타입을 가리킨다.

Reference Type변경 가능한(Mutable) 값이며, 변수에 참조 값이 할당된다.



참고 자료

모던 자바스크립트 Deep Dive

노마드 코더 유튜브

profile
자신감 충전중..

0개의 댓글