fffo

원시 값과 객체의 비교 본문

Programming/Javascript

원시 값과 객체의 비교

gggs 2021. 9. 26. 23:30

원시 값과 객체의 비교

  • 원시 값 :
    • 변경 불가능한 값
    • 변수에 할당 시 변수(확보된 메모리 공간)에는 실제 값이 저장됨
    • 원시 값을 가진 변수를 다른 변수에 할당 시 원본의 원시 값이 복사 되어 전달. 값에 의한 전달(pass by value)
  • 객체 :
    • 변경 가능한 값
    • 변수에 할당 시 변수(확보된 메모리 공간)에는 참조 값이 저장됨
    • 객체를 가진 변수를 다른 변수에 할당 시 원본의 참조 값이 복사 되어 전달 됨. 참조에 의한 전달(pass by reference)

원시 값

  • 변경 불가능 하다는 것은 변수가 아닌 값에 대한 진술
  • 데이터의 신뢰성 보장
  • 원시 값이 할당된 변수를 재할당 시 새로운 메모리 공간 확보 후 재할당한 원시 값을 저장, 변수는 새로옵게 재할당한 원시 값을 가리킴 → 불변성
  • 불변성을 갖는 원시 값을 할당한 변수는 재할당 이외에 변수 값을 변경할 수 있는 방법이 없음

문자열과 불변성

  • 문자열은 유사 배열 객체로서, 인덱스를 통해 접근은 가능하지만 변경할 수는 없음

유사 배열 객체(array-like object)

  • 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고 length 프로퍼티를 갖는 객체

값에 의한 전달

  • 엄밀히 말하면 변수에는 값이 전달되는 것이 아닌 메모리 주소가 전달되는 것
  • 중요한 것은 같은 원시 값을 할당한 두 변수의 원시 값은 서로 다른 메모리 공간에 저장된 별개의 값임 → 서로 간섭 불가

객체

  • 프로퍼티는 동적으로 추가, 삭제 가능. 프로퍼티 값 제약 ㅇ벗음
  • 클래스 기반 객체지향 프로그래밍 언어(자바, C++)에서는 미리 정의된 클래스를 기반으로 객체(인스턴스)를 만드는 반면, js는 클래스 없이 객체를 생성. 동적으로 프로퍼티와 메서드 추가
  • 이론적으로는 성능 면에서 클래스 기반 객체지향 프로그래밍 언어보다 객체 생성과 프로퍼티 접근에 비용이 더 많이 듦
  • V8 js엔진에서는 성능 향상을 위해 히든 클래스 방식 사용, C++에서의 객체 프로퍼티에의 접근 성능과 비슷한 수준 보장.

변경 가능한 값

  • 객체를 할당한 변수는 메모리 주소 값이 저장되어 있어 변수 참조 시 메모리 주소 값을 통해 실제 객체에 접근 함
  • 객체를 할당한 변수는 재할당 없이 직접 변경이 가능함. →프로퍼티를 동적으로 추가,삭제, 갱신 가능
  • 객체는 생성에 많은 자원이 들어가므로 한 번 생성한 객체를 변경 가능하게끔 설계 되었지만, 여러 개의 식별자가 하나의 객체를 공유할 수 있다는 구조적 취약점 존재

얕은 복사와 깊은 복사

  • 얕은 복사 : 객체를 프로퍼티 값으로 갖는 객체에서 한 단계만 복사
  • 깊은 복사 : 객체에 중첩되어 있는 객체까지 모두 복사
  • 두 복사 모두 복사로 생성된 개체는 원본과 다른 객체.
  • 참고) 원시 값을 할당한 변수를 다른 변수에 할당하는 것을 깊은 복사, 객체를 할당한 변수를 다른 변수에 할당하는 것을 얕은 복사라고 부르는 경우도 있음

참조에 의한 전달

  • 사실 js는 포인터가 없기 때문에 참조에 의한 전달 또한 주소 '값'을 전달 하는 것이기 때문에 결국 값에 의한 전달만 있을 뿐임
  • 공유에 의한 전달이라고도 부르지만 이또한 ECMAScript 사양에 공식적으로 정의된 용어가 아님
  • 다만, 전달되는 값의 종류가 원시 값인지 참조 값인지 구별하기 위해 위의 용어를 사용하겠음
const o = { x: {y: 1} };
const c1 = { ...o} ; // 얕은 복사
console.log(c1 === o); // false 
console.log(c1.x === o.x); // true

const c2 = o; // 이 또한 얕은 복사라고도 불림
console.log(o === c2) // true

'Programming > Javascript' 카테고리의 다른 글

js 복습 - 깊은복사, 생성자, Date  (0) 2021.09.27
함수  (0) 2021.09.27
객체 리터럴  (0) 2021.09.25
타입 변환과 단축 평가  (0) 2021.09.24
제어문  (0) 2021.09.23
Comments