모든 내용의 출처는 코어 자바스크립트입니다.
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&linkClass=&barcode=9791158391720
1. 데이터 타입의 종류
- 자바스크립트 데이터 타입은 두 가지로 나뉜다.
- 기본형과 참조형이다.
- 기본형 : 숫자, 문자열, 불리언, null, undefined
- 참조형 : 객체, 배열, 함수, 날짜, 정규표현식
- 기본형은 값이 담긴 주솟값을 바로 복제한다.
- 참조형은 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제한다.
2. 데이터 타입에 관한 배경 지식
2-1. 메모리와 데이터
- 컴퓨터는 모든 데이터를 0과 1로 바꿔 기억한다.
- 0 또는 1만 표현할 수 있는 하나의 메모리 조각을 비트라고 한다.
- 메모리는 많은 비트로 구성되어 있으며, 각 비트는 고유한 식별자를 통해 위치를 확인할 수 있다.
- 많은 비트를 묶으면 검색 시간은 줄어들지만 낭비되는 비트가 생기기도 한다.
- 표현에 제약이 있어도 문제가 없을 만큼 묶는 편이 좋다.
- 바이트는 8개의 비트로 이루어져 있다.(1바이트는 256개의 값을 표현할 수 있다.)
- 자바스크립트는 8바이트를 확본한다.
- 모든 데이터는 바이트 단위의 식별자, 메모리 주솟값을 통해 서로 구분하고 연결할 수 있다.
2-2. 식별자와 변수
- 변수는 '변할 수 있는 데이터' 이다.
- 식별자는 데이터를 식별하는 데 사용하는 이름, 즉 변수명이다.
3. 변수 선언과 데이터 할당
3-1. 변수 선언
- 변수란 변경 가능한 데이터가 담길 수 있는 공간 또는 그릇이다.
- 변수를 선언하면 컴퓨터는 메모리에서 비어있는 공간 하나를 확보한다.
- 이 공간의 이름이 식별자이다.
- 식별자에 접근하면, 컴퓨터는 식별자를 검색(주소)하고 공간에 있는 데이터를 반환한다.
- 변수 선언이란, 메모리에서 비어있는 공간을 확보하고 그 공간의 이름을 설정하는 것.
3-2. 데이터 할당
- 변수를 선언한 위치에(식별자가 있는 곳) 데이터를 직접 저장하지 않는다.
- 데이터는 또 다른 영역에 저장하고 그곳에 대한 주소가 변수 선언 위치에 기록된다.
- 즉, 변수 영여과 데이터 영역을 분리한다.
- 이로 인해, 데이터 변환을 자유롭게 할 수 있다.
- 동시에 메모리를 더욱 효율적으로 관리할 수 있다.
- 예를 들어, 변수에 저장 된 문자열 데이터를 수정하려면 데이터의 크기를 조절해야 하는데
컴퓨터가 처리해야 할 연산이 많아질 수 있다.
- 다른 예로, 1억개의 변수를 선언하고 그에 할당되는 값이 같을 때,
해당 변수를 위해 1억개의 데이터를 만들 필요는 없다. 하나의 데이터를 만들고 그 데이터의 주소를 변수가 가지고 있으면 된다.
컴퓨터는 효율적으로 움직인다.
예를 들어서 내 아이폰이 고장이 났을 때 가서 수리를 맡기는 것 보다
리퍼를 받는 것이 더 빠르고 효율적이다.(비용의 측면을 제외했을 때)
음.. 수정보단 교환이 더 빠르다.
4. 기본형 데이터와 참조형 데이터
4-1. 불변값
- 변수와 상수를 구분하는 성질은 '변경 가능성'이다.
- 변수와 상수를 구분 짓는 변경 가능성의 대상은 변수 영역 메모리이다.
- 불변성 여부를 구분할 때 변경 가능성의 대상은 데이터 영역 메모리이다.
- 기본형 데이터인 숫자, 문자열, boolean, null, undefined, Symbol은 모두 불변값이다.
4-2. 가변값
- 참조형 데이터는 '객체의 변수(프로퍼티) 영역'이 별도로 존재한다는 점.
- 객체가 별도로 할애한 영역은 변수의 영역이다.
- 데이터 영역은 기존의 메모리 공간을 그대로 활용한다.
- 그러나 변수에는 다른 값을 대입할 수 있다.
- 새로운 객체가 만들어지는 것이 아니라 기존의 객체 내부의 값이 바뀐다.
4-3. 변수 복사 비교
- 변수를 복사하는 과정은 기본형, 참조형 데이터 모두 같은 주소를 바라보게 한다.
- 기본형 데이터를 복사하고 하나를 수정하면 바라보는 주소가 바뀐다.
- 참조형 데이터를 복사하고 하나를 수정하면 바라보는 주소는 일치한다.(이후 찾아간 주소에서 연결된 주소가 다르다.)
- 즉, 참조형 데이터는 복사하는 과정에서 기본형에 비해 한 단계 더 거치게 된다.
- 새로운 객체를 할당하여 값을 직접 변경하면 객체에 대한 변경이지만 값이 달라진다.
(식별자의 이름은 같게 보이지만 다른(새로운) 값이다.)
5. 불변 객체
5-1. 불변 객체를 만드는 간단한 방법
- 참조형 데이터의 '가변'은 데이터 자체가 아닌 내부 프로퍼티를 변경할 때만 성립한다.
- 데이터 자체를 변경하고자 하면 기존 데이터는 변하지 않는다.
- 불변 객체가 필요한 경우는, 값으로 전달받은 객체에 변경을 가하더라도 원본 객체는 변하지 않아야 하는 경우
- 대상 객체의 프로퍼티 개수에 상관없이 모든 프로퍼티를 복사하는 함수를 만드는 편이 좋다.
5-2. 얕은 복사와 깊은 복사
- 얕은 복사는 바로 아래 단계의 값만 복사하는 방법
- 깊은 복사는 내부의 모든 값들을 전부 복사하는 방법
- 얕은 복사는 중첩된 객쳉서 참조형 데이터가 저장된 프로퍼티를 복사할 때
그 주솟값만 복사한다는 의미이다.
- 해당 프로퍼티에 대해 원본과 사본이 모두 동일한 참조형 데이터의 주소를 가리킨다.
- 객체 프로퍼티 중 그 값이 기본형일 경우에는 그대로 복사
- 참조형일 경우에는 다시 내부의 프로퍼티들을 복사해야한다.
6. undefined와 null
- 자바스크립트에서 '없음'을 나타내는 값
- undefined는 사용자가 명시적으로 지정할 수도, 값이 없앨 때 자바스크립트에서 자동으로 부여할 수 있다.
- 어떤 값을 지정할 것이라고 예상되는 상황에 값이 없다면 undefined를 반환한다.
- 값을 대입하지 않은 변수
- 객체 내부의 존재하지 않는 프로퍼티에 접근
- return 문이 없거나 호출되지 않는 함수의 실행
- '비어있는 요소'와 'undefined'를 할당한 요소는 출력 결과가 다르다.
- '비어있는 요소'는 순회와 관련된 많은 배열 메서드들의 순회 대상에 제외된다.
- '비어있음'을 명시적으로 나타낼 땐 'null'을 쓰자.
몇번이고 더 읽어야 하는 책이다.
저도 이 책 되게 재밌게 봤어요. 😄