Skip to content

Latest commit

 

History

History
151 lines (86 loc) · 4.39 KB

11장 원시 값과 객체의 비교.md

File metadata and controls

151 lines (86 loc) · 4.39 KB

11. 원시 값과 객체의 비교

11.1

원시 타입(primitive type)

  • immutable
  • 변수에는 실제 값이 저장
  • 다른 변수에 할당 시 원본의 원시 값이 복사되어 전달 - pass by value

객체 타입(object/reference type)

  • mutable
  • 변수에는 참조 값이 저장
  • 할당 시 참조 값이 복사되어 전달 - pass by reference

원시 값

  • 한번 생성된 원시 값은 읽기 전용

📌  변수

  • 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 / 메모리 공간을 식별하기 위해 붙인 이름

📌  값

  • 변수에 저장된 데이터
  • 표현식이 평가되어 생성된 결과

⇒ 변경 불가능한 것은 ‘값' 이다! (변수는 재할당을 통해 저장하고 있는 값을 교체 할 수 있음)

⇒ 데이터의 신뢰성을 보장

Untitled

문자열과 불변성

  • javascript에서 원시 타입은 크기를 명확하게 규정하고 있지 않음.

    → 브라우저 제조사의 구현에 따라 크기가 다를 수 있음

문자열

  • 0개 이상의 문자로 이루어진 집합

  • 1개 문자 = 2Byte

    ⇒ 문자열의 길이에 따라 필요한 메모리 공간의 크기가 결정됨

  • array-like object 이면서 이터러블 → 배열처럼 각 문자에 접근 가능

    var str = 'string';
    
    //array-like object
    console.log(str[0]); // s      배열처럼 인덱스로 프로퍼티 값에 접근 가능
    console.log(str.length); // 6  length 프로퍼티를 가짐
    //이어서
    str[0] = 'J';
    
    console.log(str[0]); // s;  

    ✏️  문자열 값도 원시 값이므로 immutable하고 변경할 수 없다. (재할당은 가능)

pass by value (=pass by sharing)

var score = 80;
var copy = score;

console.log(score === copy); // true

Untitled

✏️  score 변수와 copy 변수의 값 80은 다른 메모리 공간에 저장된 별개의 값

(엄밀히 말하자면 pass by value도 사실은 메모리 주소를 전달하고 있음. 변수와 같은 식별자는 값이 아니라 메모리 주소를 기억)

11.2

객체

  • 프로퍼티 개수가 정해져 있지 않음
  • 동적으로 추가디고 삭제

⇒ 메모리 크기를 사전에 정해둘 수 없다

js의 객체 관리 방식 - 해시 테이블

Untitled

프로퍼티 키를 인덱스로 사용하는 해시 테이블

→ javascript 엔진은 해시 테이블과 유사하지만 높은 성능을 위해 일반적인 해시 테이블보다 나은 방법으로 객체를 구현

  • V8 자바스크립트 엔진

    → 프로퍼티에 접근하기 위해 동적 탐색 대신 히든 클래스 사용

    자바와 같이 고정된 객체 레이아웃(클래스)과 유사하게 동작

객체 - immutable value

  • 원시 값을 할당한 변수: 원시 값 자체를 값으로

    객체를 할당한 변수: 변수가 기억하는 메모리 주소를 통해 참조 값(reference value)에 접근 가능

    Untitled

  • 단점:

    메모리의 효율적 소비가 어렵고 성능이 나빠질 수 있음

    여러 개의 식별자가 하나의 객체를 공유할 수 있음

shallow copy와 deep copy

const o = { x: { y: 1 }};

//shallow copy
const c1 = { ...o};   // { x: {y: 1}}
console.log(c1 === o) // false
console.log(c1.x === o.x) //true

//deep copy
const _ = require('lodash');

const c2 = _.cloneDeep(o);
console.log(c2 == o); // false
console.log(c2.x === o.x); //false

pass by value vs. passy by reference

공통점

  • 식별자가 기억하는 메모리 공간에 저장되어 있는 값을 복사해서 전달

    ⇒ 엄밀히 말하면 javascript에서는 ‘참조에 의한 전달'은 존재하지 않음. ‘값에 의한 전달'만 존재

(여기서 말하는 참조에 의한 전달은 pointer의 참조에 의한 전달과 다름)