From 405eb1423816a482faaa69873088ebb0c80be1ac Mon Sep 17 00:00:00 2001 From: moonheekim0118 Date: Mon, 4 Apr 2022 17:35:21 +0900 Subject: [PATCH 1/2] =?UTF-8?q?1.=20=EB=8D=B0=EC=9D=B4=ED=84=B0=ED=83=80?= =?UTF-8?q?=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\355\204\260-\355\203\200\354\236\205.md" | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 "\355\230\270\355\224\204/01-\353\215\260\354\235\264\355\204\260-\355\203\200\354\236\205.md" diff --git "a/\355\230\270\355\224\204/01-\353\215\260\354\235\264\355\204\260-\355\203\200\354\236\205.md" "b/\355\230\270\355\224\204/01-\353\215\260\354\235\264\355\204\260-\355\203\200\354\236\205.md" new file mode 100644 index 0000000..d25cbe5 --- /dev/null +++ "b/\355\230\270\355\224\204/01-\353\215\260\354\235\264\355\204\260-\355\203\200\354\236\205.md" @@ -0,0 +1,129 @@ +# 01. 데이터 타입 + +## 0. 자바스크립트의 데이터타입 종류 +#### 원시형 +- 숫자 , 문자열, 불리언, null, undefined + +#### 참조형 +- 객체, 배열, 함수, 날짜, 정규표현식 등 + +#### 분류 기준은 ? +- 원시형은 `값에 의한 전달`, 즉 값이 담긴 주솟값을 바로 복제한다. +- 참조형은 `참조에 의한 전달`, 즉, 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제한다. + +
+ +## 1. 데이터 타입은 왜 필요할까? +1. 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해 +2. 값을 참조할 때 한번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해 +3. 메모리에서 읽어 들인 2진수를 어떻게 해석할 지 결정하기 위해 + + +> #### 심벌 테이블 +> - 컴파일러 또는 인터프리터는 심벌 테이블이라고 부르는 자료구조를 통해 식별자를 키로 바인딩 된 값의 주소, 데이터 타입, 스코프 등을 관리한다. + +### 메모리와 데이터 +- 컴퓨터는 모든 데이터를 0 또는 1로 바꾸어 기억한다. +- 0 또는 1만 표현할 수 있는 하나의 메모리 조각을 ‘비트’라고 한다. +- 메모리는 많은 비트들로 구성돼 있는데, 각 비트는 고유한 식별자를 통해 위치를 확인 할 수 있다. +- 하지만 비트 단위로 위치를 확인하는 것은 매우 비효율적이므로, 몇 개씩 묶어 하나의 단위로 여긴다면 표현 할 수 이쓴 값도 늘고, 동시에 검색시간을 줄일 수 있을 것이다. +- 하지만 매우 많은 비트를 한 단위로 묶으면 ‘낭비되는 비트’가 생기게 된다. +- 따라서, 자주 사용하지 않을 데이터를 표현하기 위해 빈공간을 남겨놓기 보다, 표현 가능한 개수에 어느정도 제약이 따르더라도 문제가 되지 않을 적정한 공간을 묶어야 한다. +- 이런 고민의 결과로 바이트 (byte) 라는 단위가 생겼다. +- 바이트 역시 시작하는 비트의 식별자로 위치를 파악 할 수 있다. +- 모든 데이터는 바이트 단위의 식별자, 정확하게는 메모리 주솟값을 통해 서로 구분하고 연결 할 수 있다. + +
+ +## 2. 식별자와 변수 +- 변수 : 데이터 +- 식별자: 어떤 데이터를 식별하는데 사용하는 이름, 즉 변수명 + +### 변수란 왜 필요한가? +- 값을 저장하기 위해 확보한 메모리 공간을 식별하기 위해서이다. +- 메모리 주소를 직접적으로 제어하면 치명적인 오류를 발생할 수도 있거니와, 값이 저장될 때 메모리 주소는 코드가 실행되는 상황에 따라 달라지기 때문이다. +- 따라서, 개발자가 직접 메모리 주소를 통해 값을 저장하고 참조하지 않고, 변수를 통해 값에 안전히 접근하기 위해서이다. + + +
+ +## 3. 데이터 할당 +```javascript +var foo; +foo = 'bar'; +``` + +- 실제로 해당 변수 메모리에 문자열 ‘bar’를 직접 저장하지 않는다. +- 데이터를 저장하기 위한 별도의 메모리 공간을 다시 확보하여, 문자열 ‘bar’를 저장한 후, 해당 메모리의 주소를 변수 메모리에 저장한다. +- 즉, 아래와 같은 순서를 거친다. + +1. 변수 영역에서 빈 공간 확보 +2. 확보한 공간의 식별자를 foo로 지정 +3. 데이터 영역의 빈 공간에 문자열 ‘bar’ 저장 +4. 변수 영역에서 foo라는 식별자 검색 +5. 앞서 저장한 문자열 bar의 주소를 변수 영역의 공간에 대입한다. + +### 변수 영역에 값을 직접 대입하지 않는 이유는? +- 데이터 변환을더 자유롭게 하기 위해서 + 메모리 효율적 관리를 위해서 +1. `데이터 환을 자유롭게 하기 위해서 `: 만약 미리 확보한 공간 내에서 데이터를 변환할 수 있다면, 변환한 데이터를 다시 저장하기 위해서 확보한 공간을 변환된 데이터 크기에 맞게 늘리는 작업이 선행되어야 한다. +2. `메모리 효율적 관리를 위해서` : 500개의 변수를 생성해 모든 변수에 숫자 5를 할당해야한다면? 각 변수공간마다 5를 할당하려고 하면 매우 많은 메모리가 낭비된다. + +
+ +## 4. 기본형 데이터와 참조형 데이터 +### 불변값 +- 기본형 데이터는 모두 불변하다. +- `변수 vs 상수` : 변수 영역의 메모리를 변경 가능한가? + - 한번 데이터 할당이 이뤄진 변수 공간에 다른 데이터를 재할당 할 수 있는지 여부 +- `불변성 vs 가변성` : 데이터 영역의 메모리를 변경 가능한가? + +```javascript +var a = 'abc'; +a += 'def'; +``` + +- ‘abc’ 와 ‘abcdef’는 완전히 별개의 데이터이다. +- 즉, 변경은 새로 만드는 동작을 통해서 이뤄진다. +- 한번 만들어진 값은 가비지 컬렉팅을 당하지 않는 한 영원히 변하지 않는다. + + +### 가변값 +```javascript +var obj1 = { + a :1, + b: 'bbb' +} +``` + +1. 컴퓨터는 우선 변수 영역의 빈 공간을 확보하고, 그 주소의 이름을 obj1로 지정한다. +2. 임의의 데이터 공간에 데이터를 저장하려고 보니, 여러개의 프로퍼티로 이뤄진 데이터 그룹이다! 이 그룹 내부 프로퍼티를 저장하기 위해 별도의 변수 영역을 마련하고, 그 영역의 주소를 데이터 공간에 저장한다. + +- 즉, 기본형 데이터와의 차이점은 `객체의 변수(프로퍼티)영역`이 따로 존재한다는 것이다. +- 따라서 객체 프로퍼티 값을 변경하여도 객체 변수영역이 가리키는 데이터의 주소는 변하지 않는다. +- 참조형 데이터가 가변값이라고 설명할 때 , ‘가변성’은 참조형 데이터 자체를 변경할 경우가 아니라, 그 내부의 프로퍼티를 변경할 때만 성립한다. + +
+ +## 5. Undefined 와 Null + +### undefined +- ‘값이 없다’, 즉 원시 값도 아니고 객체도 아니라는 뜻이다. +- 개발자가 의도적으로 할당하기 위한 값이 아니라, 자바스크립트 엔진이 변수를 초기화 할 때 사용하는 값이다. +- 변수를 참조 했을 때 undefined 가 반환된다면 참조한 변수선언 이후 값이 할당된 적 없는, 즉 초기화 되지 않은 변수라는 것을 간파 할 수 있다. +- 변수에 값이 없다는 것을 명시하고 싶을 때는 null 을 할당하자. + +### null +- ‘객체가 아니다’라는 뜻이다. +- 값이 없다는 것을 의도적으로 명시(의도적 부재)할 때 사용한다. +- 변수에 Null 을 할당 하는 것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미이다. +- 따라서, 이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거하는 것을 의미하며, 자바스크립트 엔진은 누구도 참조하지 않는 메모리 공간에 대해 가비지 콜렉션을 수행한다. + + +### 배열과 undefined +- 비어 있는 값에 대해서는 아예 순회조차 돌지 않는다. +- 비어있는 값 !== undefined +- 배열은 결국 객체와 마찬가지로 특정 인덱스에 값을 지정할 때 비로소 빈 공간을 확보하고, 인덱스를 이름으로 지정하고 데이터의 주솟값을 저장하는 동작을 한다. +- 따라서, 값이 지정되지 않은 인덱스(비어있는 배열요소)는 *아직은 존재하지 않는 프로퍼티*에 지나지 않는다. +- 따라서 값으로서 할당된 undefined는 실존하는 데이터인 반면, 자바스크립트 엔진이 반환해주는 undefined는 문자 그대로의 값이 없음을 나타내는 것이다. + + From 56da16f990d0631d77d1678a0183dd9884683ca4 Mon Sep 17 00:00:00 2001 From: moonheekim0118 Date: Mon, 4 Apr 2022 22:32:58 +0900 Subject: [PATCH 2/2] fix typo --- ...5\260\354\235\264\355\204\260-\355\203\200\354\236\205.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/\355\230\270\355\224\204/01-\353\215\260\354\235\264\355\204\260-\355\203\200\354\236\205.md" "b/\355\230\270\355\224\204/01-\353\215\260\354\235\264\355\204\260-\355\203\200\354\236\205.md" index d25cbe5..04402f5 100644 --- "a/\355\230\270\355\224\204/01-\353\215\260\354\235\264\355\204\260-\355\203\200\354\236\205.md" +++ "b/\355\230\270\355\224\204/01-\353\215\260\354\235\264\355\204\260-\355\203\200\354\236\205.md" @@ -26,7 +26,7 @@ - 컴퓨터는 모든 데이터를 0 또는 1로 바꾸어 기억한다. - 0 또는 1만 표현할 수 있는 하나의 메모리 조각을 ‘비트’라고 한다. - 메모리는 많은 비트들로 구성돼 있는데, 각 비트는 고유한 식별자를 통해 위치를 확인 할 수 있다. -- 하지만 비트 단위로 위치를 확인하는 것은 매우 비효율적이므로, 몇 개씩 묶어 하나의 단위로 여긴다면 표현 할 수 이쓴 값도 늘고, 동시에 검색시간을 줄일 수 있을 것이다. +- 하지만 비트 단위로 위치를 확인하는 것은 매우 비효율적이므로, 몇 개씩 묶어 하나의 단위로 여긴다면 표현 할 수 있는 값도 늘고, 동시에 검색시간을 줄일 수 있을 것이다. - 하지만 매우 많은 비트를 한 단위로 묶으면 ‘낭비되는 비트’가 생기게 된다. - 따라서, 자주 사용하지 않을 데이터를 표현하기 위해 빈공간을 남겨놓기 보다, 표현 가능한 개수에 어느정도 제약이 따르더라도 문제가 되지 않을 적정한 공간을 묶어야 한다. - 이런 고민의 결과로 바이트 (byte) 라는 단위가 생겼다. @@ -65,7 +65,7 @@ foo = 'bar'; ### 변수 영역에 값을 직접 대입하지 않는 이유는? - 데이터 변환을더 자유롭게 하기 위해서 + 메모리 효율적 관리를 위해서 -1. `데이터 환을 자유롭게 하기 위해서 `: 만약 미리 확보한 공간 내에서 데이터를 변환할 수 있다면, 변환한 데이터를 다시 저장하기 위해서 확보한 공간을 변환된 데이터 크기에 맞게 늘리는 작업이 선행되어야 한다. +1. `데이터 변환을 자유롭게 하기 위해서 `: 만약 미리 확보한 공간 내에서 데이터를 변환할 수 있다면, 변환한 데이터를 다시 저장하기 위해서 확보한 공간을 변환된 데이터 크기에 맞게 늘리는 작업이 선행되어야 한다. 2. `메모리 효율적 관리를 위해서` : 500개의 변수를 생성해 모든 변수에 숫자 5를 할당해야한다면? 각 변수공간마다 5를 할당하려고 하면 매우 많은 메모리가 낭비된다.