원시 값(Primitive value) vs 객체(Object)

- 원시 값은 값이 공유되지만, 객체는 reference가 복사된다.

- 결과적으로 같은 객체 지칭

  원시 타입(Primitive type) 객체 타입(Object)
immutable  mutable
할당 실제 값 저장 참조 값 저장
재할당 원시 값 복사 참조 값 복사
전달 방식 pass by value pass by reference

 

원시 타입

- 원시 값은 변경이 불가능하다.

- 원시 값을 재할당하기 위해서는 새로운 메모리 공간에서 재할당 값을 저장하고, 참조 변수의 메모리 공간 주소를 변경해야한다.

 

 

객체 타입

- 참조 값(reference value)에 접근할 수 있는 메모리 주소를 기억할 수 있다.

ex. var obj = {name: '홍길동'}

- 객체 리터럴을 통해(객체 생성 방법 중 하나) 객체가 생성된다.

- 원시 값을 할당한 변수 obj를 참조하면, 메모리 주소 0x23에 저장되어 있는 값에 접근한다.

- 메모리에 저장되어 있는 참조 값 0x99를 통해서 실제 객체 {name: '홍길동'}에 접근할 수 있다.

 

 

유사 배열 객체(Array Like Object)

- 배열처럼 index로 프로퍼티 값에 접근이 가능하고, length 프로퍼티를 갖는 객체이다.

- 배열처럼 index로 문자에 접근이 가능하다.

 

ex. primitive value인 'hello'는 래퍼 객체(wrapper Object)에 의해 자동 변환되어 객체로 변환해준다.

- 작업이 끝나면 다시 원시 값으로 되돌아온다.

- 문자열은 원시 값이기 때문에 변하지 않는다.

 

 

ex. let myStr = '홍길동';

- 객체가 만들어지고, myStr이 할당된다. 

- 그리고, length가 정해지고

- 배열처럼 사용할 수 있도록 0,1,2에 각각 키 값들이 만들어지고 각각 할당된다.

- 밑에도 여러가지 값들이 상속 되어 들어오게 된다. 

- myStr[0] 을 실행하면 0:홍을 가져와서 홍이 출력된다.

- 객체를 복사하면, 생성하는 비용을 절약할 수 있다.

- 하지만 이런 장점이 여러 개의 식별자가 하나의 객체를 공유할 수 있다는 단점이 존재한다.

 

 

값에 의한 전달(pass by value)

- 할당받는 변수에는 변수의 원시 값이 복사되어 전달된다. 

- scode변수와 copy의 값 80은 서로 다른 메모리 공간에 저장된 별개의 값이다.

 

 

참조에 의한 전달

let person = {name: 'Lee'}

let copy = person; 

- 객체를 가리키는 person을 다른 변수 copy에 할당하면, 원본의 참조 값이 복사된다.

- 두 개의 변수가 동일한 객체의 주소를 갖는다.

- 두 변수는 지정된 메모리 주소는 다르지만, 동일한 참조 값을 갖는다.

- 한쪽에서 값이 변경되면 다른쪽도 영향을 받는다.

- 자바스크립트에서는 '참조에 의한 전달'은 존재하지 않고, '값에 의한 전달'만 존재한다고 말할 수도 있다.

 

얕은복사 Shallow copy, 깊은 복사 Deep Copy

- 얕은 복사 : 객체의 한 단계만 복사

- 깊은 복사 : 객체에 중첩되어 있는 모든 객체 복사

 

 

옵저버(Observer) 패턴

- 객체의 변경은 복잡한 코드에서 객체의 변경 추적을 어렵게 한다.

- 객체의 변경을 추적하기 위해 옵저버 패턴을 사용하여 객체를 참조하는 모든 이들에게 변경 사실을 알리고 대처하는 추가 대응이 필요하다.

 

 

순수 함수

- 외부 상태를 변경하지 않고 외부 상태에 의존하지도 않는 함수

- 함수형 프로그래밍 : 순수 함수를 통해 프로그램의 안전성을 높이는 프로그래밍 패러다임 

+ Recent posts