-
Notifications
You must be signed in to change notification settings - Fork 3
호프가 이 글을 모두에게 바칩니다. 데이터 타입 정리~🥷 #3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,129 @@ | ||
| # 01. 데이터 타입 | ||
|
|
||
| ## 0. 자바스크립트의 데이터타입 종류 | ||
| #### 원시형 | ||
| - 숫자 , 문자열, 불리언, null, undefined | ||
|
|
||
| #### 참조형 | ||
| - 객체, 배열, 함수, 날짜, 정규표현식 등 | ||
|
|
||
| #### 분류 기준은 ? | ||
| - 원시형은 `값에 의한 전달`, 즉 값이 담긴 주솟값을 바로 복제한다. | ||
| - 참조형은 `참조에 의한 전달`, 즉, 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제한다. | ||
|
|
||
| <br/> | ||
|
|
||
| ## 1. 데이터 타입은 왜 필요할까? | ||
| 1. 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해 | ||
| 2. 값을 참조할 때 한번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해 | ||
| 3. 메모리에서 읽어 들인 2진수를 어떻게 해석할 지 결정하기 위해 | ||
|
|
||
|
|
||
| > #### 심벌 테이블 | ||
| > - 컴파일러 또는 인터프리터는 심벌 테이블이라고 부르는 자료구조를 통해 식별자를 키로 바인딩 된 값의 주소, 데이터 타입, 스코프 등을 관리한다. | ||
|
|
||
| ### 메모리와 데이터 | ||
| - 컴퓨터는 모든 데이터를 0 또는 1로 바꾸어 기억한다. | ||
| - 0 또는 1만 표현할 수 있는 하나의 메모리 조각을 ‘비트’라고 한다. | ||
| - 메모리는 많은 비트들로 구성돼 있는데, 각 비트는 고유한 식별자를 통해 위치를 확인 할 수 있다. | ||
| - 하지만 비트 단위로 위치를 확인하는 것은 매우 비효율적이므로, 몇 개씩 묶어 하나의 단위로 여긴다면 표현 할 수 있는 값도 늘고, 동시에 검색시간을 줄일 수 있을 것이다. | ||
| - 하지만 매우 많은 비트를 한 단위로 묶으면 ‘낭비되는 비트’가 생기게 된다. | ||
| - 따라서, 자주 사용하지 않을 데이터를 표현하기 위해 빈공간을 남겨놓기 보다, 표현 가능한 개수에 어느정도 제약이 따르더라도 문제가 되지 않을 적정한 공간을 묶어야 한다. | ||
| - 이런 고민의 결과로 바이트 (byte) 라는 단위가 생겼다. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 왜 1바이트는 8비트인가요? 8비트가 적정한 공간이라는 의미일까요? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 정말 생각지도 못했던 질문입니다!! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 와 대단합니다!! ㅋㅋ |
||
| - 바이트 역시 시작하는 비트의 식별자로 위치를 파악 할 수 있다. | ||
| - 모든 데이터는 바이트 단위의 식별자, 정확하게는 메모리 주솟값을 통해 서로 구분하고 연결 할 수 있다. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 각 데이터 타입은 할당되는 메모리 용량이 다른데, 자바스크립트 엔진은 컴파일 시가 아니라 런타임 시 타입을 추론한다고 알고 있어요! 이 메모리 용량도 런타임 시에 타입에 맞게 할당되는 걸까요? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이 질문 너무 좋아서 디스커션에서 답해드릴게요 슝~ |
||
|
|
||
| <br/> | ||
|
|
||
| ## 2. 식별자와 변수 | ||
| - 변수 : 데이터 | ||
| - 식별자: 어떤 데이터를 식별하는데 사용하는 이름, 즉 변수명 | ||
|
|
||
| ### 변수란 왜 필요한가? | ||
| - 값을 저장하기 위해 확보한 메모리 공간을 식별하기 위해서이다. | ||
| - 메모리 주소를 직접적으로 제어하면 치명적인 오류를 발생할 수도 있거니와, 값이 저장될 때 메모리 주소는 코드가 실행되는 상황에 따라 달라지기 때문이다. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 메모리 주소를 직접적으로 제어해서 발생할 수 있는 치명적인 오류의 예시를 알 수 있을까요? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 오..좋은 질문! 만약에 실수로 개발자가 운영체제가 사용하고 있는 값을 변경한다면 어떤 일이 벌어질까요?! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 오 역질문인가요? 다른 프로세스가 사용하고 있는 메모리 영역을 침범하면 해당 프로세스의 데이터가 손상되거나 정상 동작하지 않을 수 있겠죠? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 크롬을 기준으로 설명드릴게요. 크롬은 멀티 프로세스 브라우저입니다. 즉, 하나의 탭 = 하나의 프로세스로 실행되구요, 그러면 당연히 프로세스는 메모리를 사용하게 됩니다! |
||
| - 따라서, 개발자가 직접 메모리 주소를 통해 값을 저장하고 참조하지 않고, 변수를 통해 값에 안전히 접근하기 위해서이다. | ||
|
|
||
|
|
||
| <br/> | ||
|
|
||
| ## 3. 데이터 할당 | ||
| ```javascript | ||
| var foo; | ||
| foo = 'bar'; | ||
| ``` | ||
|
|
||
| - 실제로 해당 변수 메모리에 문자열 ‘bar’를 직접 저장하지 않는다. | ||
| - 데이터를 저장하기 위한 별도의 메모리 공간을 다시 확보하여, 문자열 ‘bar’를 저장한 후, 해당 메모리의 주소를 변수 메모리에 저장한다. | ||
| - 즉, 아래와 같은 순서를 거친다. | ||
|
|
||
| 1. 변수 영역에서 빈 공간 확보 | ||
| 2. 확보한 공간의 식별자를 foo로 지정 | ||
| 3. 데이터 영역의 빈 공간에 문자열 ‘bar’ 저장 | ||
| 4. 변수 영역에서 foo라는 식별자 검색 | ||
| 5. 앞서 저장한 문자열 bar의 주소를 변수 영역의 공간에 대입한다. | ||
|
|
||
| ### 변수 영역에 값을 직접 대입하지 않는 이유는? | ||
| - 데이터 변환을더 자유롭게 하기 위해서 + 메모리 효율적 관리를 위해서 | ||
| 1. `데이터 변환을 자유롭게 하기 위해서 `: 만약 미리 확보한 공간 내에서 데이터를 변환할 수 있다면, 변환한 데이터를 다시 저장하기 위해서 확보한 공간을 변환된 데이터 크기에 맞게 늘리는 작업이 선행되어야 한다. | ||
| 2. `메모리 효율적 관리를 위해서` : 500개의 변수를 생성해 모든 변수에 숫자 5를 할당해야한다면? 각 변수공간마다 5를 할당하려고 하면 매우 많은 메모리가 낭비된다. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 그러면 같은 값일 때는 같은 주솟값을 가지고 있는 것이라는 의미가 될 것 같은데, 맞나요? 예를 들면 const str1 = 'hope';
const str2 = 'hope';에서 str1과 str2는 서로 같은 주솟값을 가지고 있는 것일까요? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 네 맞습니다! 두번째 구문에서 str2에 'hope'이란 문자열을 할당할 때, 먼저 메모리의 데이터 영역에 'hope'이라는 문자열이 저장되었는지 찾아보고 있다면 해당 메모리를 저장한다구 해요! |
||
|
|
||
| <br/> | ||
|
|
||
| ## 4. 기본형 데이터와 참조형 데이터 | ||
| ### 불변값 | ||
| - 기본형 데이터는 모두 불변하다. | ||
| - `변수 vs 상수` : 변수 영역의 메모리를 변경 가능한가? | ||
| - 한번 데이터 할당이 이뤄진 변수 공간에 다른 데이터를 재할당 할 수 있는지 여부 | ||
| - `불변성 vs 가변성` : 데이터 영역의 메모리를 변경 가능한가? | ||
|
|
||
| ```javascript | ||
| var a = 'abc'; | ||
| a += 'def'; | ||
| ``` | ||
|
|
||
| - ‘abc’ 와 ‘abcdef’는 완전히 별개의 데이터이다. | ||
| - 즉, 변경은 새로 만드는 동작을 통해서 이뤄진다. | ||
| - 한번 만들어진 값은 가비지 컬렉팅을 당하지 않는 한 영원히 변하지 않는다. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 자바스크립트의 가비지 컬렉팅은 어떤 상황에서 이루어지나요? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 다른언어..아마도 C같은 저수준 언어에서는, 메모리 해제를 하기 위해서는 직접 메모리 해제를 호출해야한다고 알고있어요! 그러면 대체 어떻게 해당 메모리가 더이상 쓸모없어졌다는 것을 알게될까요? 그러면 가비지컬렉터는 어떻게 동작할까요?
크..민초덕분에 딥하게 공부하네요 |
||
|
|
||
|
|
||
| ### 가변값 | ||
| ```javascript | ||
| var obj1 = { | ||
| a :1, | ||
| b: 'bbb' | ||
| } | ||
| ``` | ||
|
|
||
| 1. 컴퓨터는 우선 변수 영역의 빈 공간을 확보하고, 그 주소의 이름을 obj1로 지정한다. | ||
| 2. 임의의 데이터 공간에 데이터를 저장하려고 보니, 여러개의 프로퍼티로 이뤄진 데이터 그룹이다! 이 그룹 내부 프로퍼티를 저장하기 위해 별도의 변수 영역을 마련하고, 그 영역의 주소를 데이터 공간에 저장한다. | ||
|
|
||
| - 즉, 기본형 데이터와의 차이점은 `객체의 변수(프로퍼티)영역`이 따로 존재한다는 것이다. | ||
| - 따라서 객체 프로퍼티 값을 변경하여도 객체 변수영역이 가리키는 데이터의 주소는 변하지 않는다. | ||
| - 참조형 데이터가 가변값이라고 설명할 때 , ‘가변성’은 참조형 데이터 자체를 변경할 경우가 아니라, 그 내부의 프로퍼티를 변경할 때만 성립한다. | ||
|
|
||
| <br/> | ||
|
|
||
| ## 5. Undefined 와 Null | ||
|
|
||
| ### undefined | ||
| - ‘값이 없다’, 즉 원시 값도 아니고 객체도 아니라는 뜻이다. | ||
| - 개발자가 의도적으로 할당하기 위한 값이 아니라, 자바스크립트 엔진이 변수를 초기화 할 때 사용하는 값이다. | ||
| - 변수를 참조 했을 때 undefined 가 반환된다면 참조한 변수선언 이후 값이 할당된 적 없는, 즉 초기화 되지 않은 변수라는 것을 간파 할 수 있다. | ||
| - 변수에 값이 없다는 것을 명시하고 싶을 때는 null 을 할당하자. | ||
|
|
||
| ### null | ||
| - ‘객체가 아니다’라는 뜻이다. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. null의 데이터 타입은 object로 알고 있는데요! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 자바스크립트는 일단 자바에서 값을 원시값과 객체로 나눈 접근법을 빌려왔고, 자바에서 '객체가 아님'을 나타내는 값인 null 을 도입해왔다고 합니다. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 형식상으로는 object이지만 의미상으로는 object가 아니다라는 의미군요! 역설적인 버그네요~ |
||
| - 값이 없다는 것을 의도적으로 명시(의도적 부재)할 때 사용한다. | ||
| - 변수에 Null 을 할당 하는 것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미이다. | ||
| - 따라서, 이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거하는 것을 의미하며, 자바스크립트 엔진은 누구도 참조하지 않는 메모리 공간에 대해 가비지 콜렉션을 수행한다. | ||
|
|
||
|
|
||
| ### 배열과 undefined | ||
| - 비어 있는 값에 대해서는 아예 순회조차 돌지 않는다. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 비어있는 값이 어떤건가요? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 만약 프로그래머가 아래와 같이 명시적으로 null을 삽이한 경우 null 도 순회를 돌게됩니다. undefined 도 마찬가지구요! const arr = [null,null];
arr.forEach((_,idx)=>{
console.log(idx)
})
// 0, 1 출력 여기서 말하는 '비어있는 값'은 애초에 배열에 할당 조차 되지 않은 값을 의미하는게 아닐까 싶네요~! 따라서, 자바스크립트가 반환해주는 undefined는 문자 그대로의 값이 없음을 나타내는 거고, |
||
| - 비어있는 값 !== undefined | ||
| - 배열은 결국 객체와 마찬가지로 특정 인덱스에 값을 지정할 때 비로소 빈 공간을 확보하고, 인덱스를 이름으로 지정하고 데이터의 주솟값을 저장하는 동작을 한다. | ||
| - 따라서, 값이 지정되지 않은 인덱스(비어있는 배열요소)는 *아직은 존재하지 않는 프로퍼티*에 지나지 않는다. | ||
| - 따라서 값으로서 할당된 undefined는 실존하는 데이터인 반면, 자바스크립트 엔진이 반환해주는 undefined는 문자 그대로의 값이 없음을 나타내는 것이다. | ||
|
|
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오호 심벌 테이블이란게 있군요!
심벌 테이블이 어떤 방식으로 데이터를 관리하는지 설명해주실 수 있나요?
구조도 궁금하네요!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
일단 심볼테이블이란 것 자체는 자료구조 이름이라구 하네요. '키-값'으로 이루어진 해시테이블을 심볼테이블 이라구 한대요!
따라서 심볼테이블은 자바스크립트에만 있는게 아니라, 컴파일러 또는 인터프리터 같은 언어 변환기에서 사용되는 자료구조라고 해요!
그러면..심볼테이블이 왜 필요하냐하면, 식별자(변수명)과 데이터의 주소,타입,스코프 등을 저장하기 위해서라구 합니다.
즉, 변수가 선언된다고 하면 테이블에 변수의 타입과 이름, 주소 등을 저장하게 되는거죠.
그러면 이를 또 왜 저장해야하냐? 라고 반문하실 수 있을텐데, 그러면 아래와 같은 이유 때문이라고 합니다~
따라서 자바스크립트의 심볼테이블 구조는 '식별자(key) - 값의 주소/데이터 타입/ 스코프 등(value)'이 되고, 심벌 테이블에 저장된 정보를 통해 인터프리터가 자바스크립트 코드를 해석한다고 볼 수 있을 것 같아요.
심벌테이블의 구조는 그냥 일반적인 해시테이블과 같다고 생각하시면 될 것 같아요! 대신 key 가 식별자, value 가 위에서 말했듯이 값의 주소/데이터 타입/ 스코프 등이 되겠죠?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
그럼 간단히 말해서 자바스크립트에서 사용하는 각종 정보들을 키 - 값으로 매칭해서 저장해두는 자료구조(해시테이블)라고 이해하면 될까요?