본문 바로가기
학습중.../(책)모던 자바스크립트

~153p

by sweesweet 2023. 1. 9.

p137

값에 의한 전달 : 원시값을 갖는 변수는 다른 변수에 할당되면 원본의 원시 값이 복사되어 전달
참조에 의한 전달 : 객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조값이 복사되어 전달

한번 생성된 원시 값은 읽기 전용값으로서 변경할 수 없다.

 

p138 

변수: 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름
변수 값: 변수에 저장된 데이터로서 표현식이 평가되어 생성된 결과, 변경 불가능
상수: 재할당이 금지된 변수,1번만 할당이 허용되므로 변수 값을 변경할 수 없음

원시값의 특성: 어떤 일이 있어도 불변.데이터의 신뢰성을 보장

원시값을 할당한 변수에 새로운 원시 값을 재할당하면 메모리 공간에 저장되어있는 재할당 이전의 원시 값을 변경하는 것이 아니라 새로운 메모리 공간을 확보하고 재할당한 원시값을 저장한 후, 변수는 새롭게 재할당한 원시 값을 가리킴

(변수가 참조하던 메모리 공간의 주소가 바뀜)

 

p139 

원시값은 변경 불가능한 값이기 떄문에 값을 직접 변경x (값의 불변성) => 원시 값을 재할당 하면 새로운 메모리 공간을 확보하고 재할당한 값을 저장한 후, 변수가 참조하던 메모리 공간의 주소를 변경

원시값을 할당한 변수는 재할당 이외에 변수 값을 변경할 수 있는 방법이 없음

만약 재할당 이외에 원시 값이 변수 값을 변경할 수 있다면 예기치 않게 변수 값이 변경될 수 있다는 것을 의미한다. 이는 값의 변경, 즉 상태 변경을 추적하기 어렵게 만든다

 

p140

1개의 문자는 2바이트의 메모리 공간에 저장된다. 숫자값은 1도, 10000000도 동일한 8바이트가 필요하지만 문자열인 경우(단순계산시) 1개의 문자로 이루어진 문자열은 2바이트, 10개의 문자로 이뤄진 문자열은 20바이트가 필요하다. 

p141

문자열은 유사 배열 객체이면서 이터러블이므로 배열과 유사하게 각 문자에 접근할 수 있다.

유사 배열 객체란 마치 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고, length프로퍼티를 갖는 객체를 말한다. 문자열은 마치 배열처럼 인덱스를 통해 각 문자에 접근할 수 있으며, length프로퍼티를 갖기때문에 유사 배열 객체이고 for문으로 순회할수도 있다. 원시값을 객체처럼 사용하면 원시값을 감싸는 래퍼객체로 자동 변환된다

이미 생성된 문자열의 일부 문자를 변경해도 반영되지 않음 => 문자열은 변경 불가능한 값

데이터의 신뢰성 보장: 한번 생성된 문자열은 읽기 전용 값으로서 변경할 수 없다. 예기치 못한 변경으로부터 자유롭다

변수에 새로운 문자열을 재할당하는 것은 가능!

 

p142

값에 의한 전달: 변수에 원시값을 가진 변수를 할당하면 할당받는 변수에는 할당되는변수의 원시값이 복사되어 전달.

하지만  두 변수는 다른 메모리 공간에 저장된 별개의 값이다. 

 

p145-6

변수에는 값이 전달되는 것이 아니라 메모리주소가 전달! => 변수와 같은 식별자는 값이 아니라 메모리 주소를 기억

값에의한 전달도 사실은 값을 전달하는 것이 아닌 메모리 주소를 전달.

단 전달된 메모리 주소를 통해 메모리 공간에 접근하면 값을 참조할 수 있다.

두 변수의 원시 값은 서로 다른 메모리 공간에 저장된 별개의 값이 되어 어느 한쪽에서 재할당을 통해 값을 변경하더라도 서로 간섭 할 수 없다.

 

p146

객체

프로퍼티의 개수가 정해져 있지 않고, 동적으로 추가되고 삭제할 수 있음
원시 값과 같이 확보해야할 메모리 공간의 크기를 사전에 정해둘 수 없음
원시값은 상대적으로 적은 메모리를 소비하지만 객체는 경우에 따라 크기가 매우 클 수 있음
-객체를 생성하고 프로퍼티에 접근하는 것도 원시값과 비교할 대 비용이 많이 드는 일
객체의 관리 방식
자바스크립트 객체는 프로퍼티 키를 인덱스로 사용하는 해시테이블 이라고 생각할 수 있다 대부분의 자바스크립트 엔진은 해시테이블과 유사하지만 높은 성능을 위해 일반적인 해시테이블 보다 더 나은 방법으로 객체를 구현한다.
v8자바스크립트 엔진에서는 프로퍼티에 접근하기위해 동적탐색 대신 히든클래스 방식을 사용해 c++객체의 프로퍼티에 접근하는 정도의 성능을 보장한다. 히든클래스는 자바와같이 고정된 객체 레이아웃과 유사하게 동작한다

 

p147

객체는 변경가능한 값!

객체를 할당한 변수가 기억하는 메모리 주소를 통해 메모리 공간에 접근하면 참조값에 접근할 수 있다.

참조값은 생성된 객체가 저장된 메모리 공간의 주소 그 자체다

 

p148

원시값을 할당한 변수를 참조하면 메모리에 저장되어 있는 원시값에 접근

객체를 할당한 변수를 참조하면 메모리에 저장되어있는 참조값을 통해 실제 객체에 접근

-객체를 할당한 변수는 재할당없이 객체를 직접 변경할 수 있다.

-재할당 없이 프로퍼티를 동적으로 추가할 수 있고 프로퍼티 값을 갱신할수도 있으며 프로퍼티 자체를 삭제할 수도있다.

 

p149

객체를 할당한 변수에 재할당을 하지 않았으므로 객체를 할당한 변수의 참조값은 변경되지않는다.

객체는 크기가 매우 클수도 있고, 원시값 처럼 크기가 일정하지도 않으며, 프로퍼티 값이 객체일수도 있어서 복사해서 생성하는 비용이 많이듦 =>메모리의 효율적 소비가 어렵고 성능이 나빠짐

메모리를 효율적으로 사용하기 위해, 그리고 객체를 복사해 생성하는 비용을 절약하여 성능을 향상시키기 위해 객체를 변경가능한 값으로 설계되어 있다. 메모리 사용의 효율성과 성능을 위해 어느정도 구조적인 단점을 감안한 설계라고 할 수 있다. 객체는 이러한 구조적단점에 따른 부작용이 있다. 원시값과는 다르게 여러개의 식별자가 하나의 객체를 공유할 수 있다

 

p150

깊은복사 얕은 복사
객체를 프로퍼티 값으로 갖는 객체의 경우 얕은 복사는 한 단계까지만 복사하는 것을 말하고 깊은 복사는 객체에 중첩되어있는 객체까지 모두 복사하는 것을 말한다
얕은 복사와 깊은 복사로 생성된 객체는 원본과는 다른 객체다. 즉 원본과 복사본은 참조 값이 다른 별개의 객체다. 하지만 얕은 보사는 객체에 중첩되어있는 객체의경우 참조값을 복사하고 깊은 복사는 객체에 중첩되어있는 객체까지 모두 복사해서 원시값처럼 완전한 복사본을 만든다는 차이가있다

 

 

p151

참조에 의한 전달 : 객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조값이 복사되어 전달

두개의 식별자가 하나의 객체를 공유하는 것을 의미

원본 또는 사본중 어느 한쪽에서 객체를 변경(변수에 새로운 객체를 재할당하는 것이 아니라 객체의 프로퍼티 값을 변경하거나 프로퍼티를 추가, 삭제)하면 서로 영향을 주고 받게 됨

 

p152 값에 의한 전달과 참조에 의한 전달은 식별자가 기억하는 메모리 공간에 저장되어 있는 값을 복사해서 전달한다는 면에선 동일!

하지만 식별자가 기억하는 메모리 공간(변수에 저장되어있는 값)이 원시값이냐 참조값이냐의 차이 일뿐, 자바스크린트는 참조에의한 전달은 존재하지않고 값에의한 전달만이 존재한다고 말할 수 있다

'학습중... > (책)모던 자바스크립트' 카테고리의 다른 글

~p136  (0) 2023.01.03
~p123  (0) 2023.01.02
~p107  (0) 2023.01.01
~p92  (0) 2022.12.30
~p73  (0) 2022.12.29