[javascript] 메모리개념과제
javascript의 자료형과 메모리
javascript의 자료형과 javascript만의 특성은 무엇일까 ?
-
자료형
-
숫자형(number type) int, float과 같은 숫자형과 특수 숫자 값(special numeric value)을 모두 포함한다. 특수 숫자값 Infinity : 무한대(∞). ‘‘나누기 0’ 연산을 하면 무한대가 출력된다 Nan : Not a Number
-
BigInt : 기본 숫자형 범위 ( (2^53-1)~-(2^53-1) ) 보다 큰 값을 저장할 때 사용하는 자료형. 숫자 뒤에 n을 붙여 표시한다. 일부 브라우저에서 호환되지않는다.
const bigint = 12345678901234567890n;
-
문자형(string) 기본 문자열 : ‘ ‘ 또는 “ “ 으로 표시한다. 템플릿 리터럴(template literal) : ` ` 으로 표시한다. ${ } 문구를 통해 문자열 사이 표현식을 입력할 수 있으며, 여러줄에 걸쳐 문자열을 작성할 수 있다.
-
논리형(boolean) 참(true), 거짓(false) 두 가지 값만을 포함한다.
-
null ‘존재하지 않는(nothing)’ 값, ‘비어 있는(empty)’ 값, ‘알 수 없는(unknown)’ 값을 나타낸다.
-
undefined 변수 선언 후 값이 대입되어있지 않을 때 초기값으로 할당된다.
-
객체(object) 키(key)와 값(value)의 쌍( 프로퍼티(property) ) 로 구성된 데이터 집합 { } 로 선언하고, . 을 통해 값에 접근한다.
let person = { name: "harry", job: "magician", age: 15 } console.log(person.name)
-
심볼(symbol) : 변경이 불가능하며 다른 값과 중복될 수 없는 고유 상수값이며 객체의 key로 사용된다.
-
-
특성
- HTML/CSS와 통합할 수 있다.
- 모든 주요 브라우저에서 지원하고, 기본 언어로 사용된다.
- 컴파일 과정이 필요하지않다.
javascript 객체와 불변성이란 ?
-
immutable value & mutable value 자료형 중 원시타입 (Boolean, numm, undefined, Number, String, Symbol) 은 값의 변경이 불가능하다. ( immutable value ) 값을 바꾸는 경우 다른 메모리에 데이터를 넣어 메모리 주소를 변경하는 방식으로 진행한다. 대입 시에는 값을 넘겨준다. 때문에 참조받은 레퍼런스에서 원본데이터를 변경할 수 없다. ( immutable value ) ( 이 점 때문에 선언 시 자료형을 지정할 필요가 없나보다.)
let a = 1; let b = a; // ▶ 대입 시 값을 넘겨준다. a = 2; console.log(a) // 2 console.log(b) // 1 ▶ 값을 넘겨받았기 때문에 a값의 변경에 영향을 받지 않는다.
객체는 참조(reference) 형태로 데이터를 주고 받기때문에 참조받은 레퍼런스에서 원본데이터를 변경할 수 있다. (mutable value)
let obj = { a:1 }; let copy = obj; // ▶ 대입 시 참조형태로 넘겨준다. ( C의 pointer와 같은 개념인것같다. ) obj.b = 2; console.log(obj) // {a: 1, b: 2} console.log(copy) // {a: 1, b: 2} ▶ 참조형태로 넘겨받았기 때문에 obj값의 변경에 영향을 받는다.
원본데이터 변경 시 참조데이터도 변한다.
-
불변 데이터 패턴(immutable data pattern) 예제와 같이 객체는 의도하지 않은 원본데이터의 변경이 발생할 수 있으므로 이를 방지하기 위해 아래와 같은 데이터 패턴을 사용한다.
-
객체의 방어적 복사(defensive copy)
Object.assign(target, source... );
객체의 참조가 아닌 값(프로퍼티)을 넘겨받는다.let obj1 = { a: 1 }; let obj2 = { b: 2 }; let copy = {}; Object.assign(copy, obj1, obj2); // ▶ obj1, obj2 의 값을 copy로 병합하여 넘겨받는다. // copy = Object.assign({}, obj1, obj2); ▶ assign 함수의 Return 값도 복사결과의 객체이기때문에 이렇게 사용할 수도 있다. console.log(obj1) // { a: 1 } console.log(obj2) // { b: 2 } ▶ 값을 넘겼기 때문에 원본 데이터가 유지된다. console.log(copy); // { a: 1, b: 2 }
-
불변화객체
-
Object.freeze(object)
불변객체로 만든다.let obj = { a: 1 }; Object.freeze(obj); obj.a = 2; // ▶ 무시된다 console.log(obj) // { a: 1 }
단, 이 경우 객체 내 객체(Nested Object)는 변경이 가능하며 객체 내 객체도 보호할 경우
deepFreeze()
를 사용한다. -
Immutable.js
Facebook이 제공하는 영구 불변 데이터 구조로 install 후 사용이 가능하다.
-
-
참조
- https://poiemaweb.com/
- https://ko.javascript.info/
- https://noogoonaa.tistory.com/78