Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 129 additions & 0 deletions 호프/01-데이터-타입.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
# 01. 데이터 타입

## 0. 자바스크립트의 데이터타입 종류
#### 원시형
- 숫자 , 문자열, 불리언, null, undefined

#### 참조형
- 객체, 배열, 함수, 날짜, 정규표현식 등

#### 분류 기준은 ?
- 원시형은 `값에 의한 전달`, 즉 값이 담긴 주솟값을 바로 복제한다.
- 참조형은 `참조에 의한 전달`, 즉, 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제한다.

<br/>

## 1. 데이터 타입은 왜 필요할까?
1. 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해
2. 값을 참조할 때 한번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해
3. 메모리에서 읽어 들인 2진수를 어떻게 해석할 지 결정하기 위해


> #### 심벌 테이블
> - 컴파일러 또는 인터프리터는 심벌 테이블이라고 부르는 자료구조를 통해 식별자를 키로 바인딩 된 값의 주소, 데이터 타입, 스코프 등을 관리한다.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오호 심벌 테이블이란게 있군요!
심벌 테이블이 어떤 방식으로 데이터를 관리하는지 설명해주실 수 있나요?
구조도 궁금하네요!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

일단 심볼테이블이란 것 자체는 자료구조 이름이라구 하네요. '키-값'으로 이루어진 해시테이블을 심볼테이블 이라구 한대요!

따라서 심볼테이블은 자바스크립트에만 있는게 아니라, 컴파일러 또는 인터프리터 같은 언어 변환기에서 사용되는 자료구조라고 해요!
그러면..심볼테이블이 왜 필요하냐하면, 식별자(변수명)과 데이터의 주소,타입,스코프 등을 저장하기 위해서라구 합니다.
즉, 변수가 선언된다고 하면 테이블에 변수의 타입과 이름, 주소 등을 저장하게 되는거죠.
그러면 이를 또 왜 저장해야하냐? 라고 반문하실 수 있을텐데, 그러면 아래와 같은 이유 때문이라고 합니다~

1. 의미 분석 :  테이블에 저장된 정보를 사용하여 식과 할당이 시멘틱(의미)적으로 올바른지 확인(유형 검사) 할 수 있습니다.
2. 중간 코드 생성: 할당되는 런타임의 양과 유형을 알기 위한 심벌 테이블을 참조하고 임시 변수 정보를 추가합니다.
3. 코드 최적화: 최적화를 위해 심벌 테이블에 있는 정보를 사용합니다.
4. 대상 코드 생성: 테이블에 있는 식별자의 주소 정보를 사용하여 코드를 생성합니다.

따라서 자바스크립트의 심볼테이블 구조는 '식별자(key) - 값의 주소/데이터 타입/ 스코프 등(value)'이 되고, 심벌 테이블에 저장된 정보를 통해 인터프리터가 자바스크립트 코드를 해석한다고 볼 수 있을 것 같아요.

심벌테이블의 구조는 그냥 일반적인 해시테이블과 같다고 생각하시면 될 것 같아요! 대신 key 가 식별자, value 가 위에서 말했듯이 값의 주소/데이터 타입/ 스코프 등이 되겠죠?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그럼 간단히 말해서 자바스크립트에서 사용하는 각종 정보들을 키 - 값으로 매칭해서 저장해두는 자료구조(해시테이블)라고 이해하면 될까요?


### 메모리와 데이터
- 컴퓨터는 모든 데이터를 0 또는 1로 바꾸어 기억한다.
- 0 또는 1만 표현할 수 있는 하나의 메모리 조각을 ‘비트’라고 한다.
- 메모리는 많은 비트들로 구성돼 있는데, 각 비트는 고유한 식별자를 통해 위치를 확인 할 수 있다.
- 하지만 비트 단위로 위치를 확인하는 것은 매우 비효율적이므로, 몇 개씩 묶어 하나의 단위로 여긴다면 표현 할 수 있는 값도 늘고, 동시에 검색시간을 줄일 수 있을 것이다.
- 하지만 매우 많은 비트를 한 단위로 묶으면 ‘낭비되는 비트’가 생기게 된다.
- 따라서, 자주 사용하지 않을 데이터를 표현하기 위해 빈공간을 남겨놓기 보다, 표현 가능한 개수에 어느정도 제약이 따르더라도 문제가 되지 않을 적정한 공간을 묶어야 한다.
- 이런 고민의 결과로 바이트 (byte) 라는 단위가 생겼다.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

왜 1바이트는 8비트인가요? 8비트가 적정한 공간이라는 의미일까요?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정말 생각지도 못했던 질문입니다!!
찾아봤어요.
이유는 컴퓨터 구조가 영문권인 곳에서 발전했기 때문이라고 합니다.
0101010 로 이루어진 전자신호를 사람이 인식할 수 있는 문자로 저장을 했어야 했는데,
이런 문자를 표현하는 코드들의 숫자가 7bit ~8bit 으로 충분했기 때문이라고 하네요?
(ASCII : 제어문자(32개), 출력가능문자(영소문자, 영대문자, 숫자, 기타 기호, parity bit 등등)
이에 따라서 1바이트에 에 문자 1개를 저장할 수 있는 8비트 구조가 된 것이라고 합니다.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와 대단합니다!! ㅋㅋ

- 바이트 역시 시작하는 비트의 식별자로 위치를 파악 할 수 있다.
- 모든 데이터는 바이트 단위의 식별자, 정확하게는 메모리 주솟값을 통해 서로 구분하고 연결 할 수 있다.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

각 데이터 타입은 할당되는 메모리 용량이 다른데, 자바스크립트 엔진은 컴파일 시가 아니라 런타임 시 타입을 추론한다고 알고 있어요! 이 메모리 용량도 런타임 시에 타입에 맞게 할당되는 걸까요?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 질문 너무 좋아서 디스커션에서 답해드릴게요 슝~


<br/>

## 2. 식별자와 변수
- 변수 : 데이터
- 식별자: 어떤 데이터를 식별하는데 사용하는 이름, 즉 변수명

### 변수란 왜 필요한가?
- 값을 저장하기 위해 확보한 메모리 공간을 식별하기 위해서이다.
- 메모리 주소를 직접적으로 제어하면 치명적인 오류를 발생할 수도 있거니와, 값이 저장될 때 메모리 주소는 코드가 실행되는 상황에 따라 달라지기 때문이다.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메모리 주소를 직접적으로 제어해서 발생할 수 있는 치명적인 오류의 예시를 알 수 있을까요?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오..좋은 질문!

만약에 실수로 개발자가 운영체제가 사용하고 있는 값을 변경한다면 어떤 일이 벌어질까요?!

Copy link
Collaborator

@jswith jswith Apr 4, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 역질문인가요? 다른 프로세스가 사용하고 있는 메모리 영역을 침범하면 해당 프로세스의 데이터가 손상되거나 정상 동작하지 않을 수 있겠죠?
질문 : 웹 브라우저에서 작동하는 자바스크립트도 운영체제의 메모리 영역과 관련이 있나요?

Copy link
Member Author

Choose a reason for hiding this comment

The 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를 할당하려고 하면 매우 많은 메모리가 낭비된다.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그러면 같은 값일 때는 같은 주솟값을 가지고 있는 것이라는 의미가 될 것 같은데, 맞나요?

예를 들면

const str1 = 'hope';
const str2 = 'hope';

에서 str1과 str2는 서로 같은 주솟값을 가지고 있는 것일까요?

Copy link
Member Author

Choose a reason for hiding this comment

The 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’는 완전히 별개의 데이터이다.
- 즉, 변경은 새로 만드는 동작을 통해서 이뤄진다.
- 한번 만들어진 값은 가비지 컬렉팅을 당하지 않는 한 영원히 변하지 않는다.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

자바스크립트의 가비지 컬렉팅은 어떤 상황에서 이루어지나요?
다른 언어의 가비지 컬렉팅과 차이가 있을까요?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

다른언어..아마도 C같은 저수준 언어에서는, 메모리 해제를 하기 위해서는 직접 메모리 해제를 호출해야한다고 알고있어요!
반면 자바스크립트는 객체가 생성되었을 때 자동으로 메모리를 할당하고 쓸모 없어졌을 때 자동으로 해제합니다!

그러면 대체 어떻게 해당 메모리가 더이상 쓸모없어졌다는 것을 알게될까요?
자바스크립트와 같은 고수준 언어들은 가비지콜렉터 (GC) 를 사용한다고 합니다. 가비지 콜렉터의 목적은 메모리 할당을 추적하고 할당된 메모리 블록이 더 이상 필요하지 않게 되었는지 판단하고 회수하는거죠.

그러면 가비지컬렉터는 어떻게 동작할까요?

  • 가비지 콜렉션 알고리즘의 핵심 개념은 '참조'라고합니다. A라는 메모리를 통해 (명시적이든 암시적이든) B라는 메모리에 접근할 수 있다면 "B는 A에 참조된다" 라고 한다고해요.
  • 따라서 '참조 카운팅 알고리즘'을 사용하는데요, 이 알고리즘은 어떤 객체를 참조하는 객체가 하나도 없는 경우 해당 객체를 '가비지'라고 부른다고 하고, 이를 회수하겠죠?

크..민초덕분에 딥하게 공부하네요



### 가변값
```javascript
var obj1 = {
a :1,
b: 'bbb'
}
```

1. 컴퓨터는 우선 변수 영역의 빈 공간을 확보하고, 그 주소의 이름을 obj1로 지정한다.
2. 임의의 데이터 공간에 데이터를 저장하려고 보니, 여러개의 프로퍼티로 이뤄진 데이터 그룹이다! 이 그룹 내부 프로퍼티를 저장하기 위해 별도의 변수 영역을 마련하고, 그 영역의 주소를 데이터 공간에 저장한다.

- 즉, 기본형 데이터와의 차이점은 `객체의 변수(프로퍼티)영역`이 따로 존재한다는 것이다.
- 따라서 객체 프로퍼티 값을 변경하여도 객체 변수영역이 가리키는 데이터의 주소는 변하지 않는다.
- 참조형 데이터가 가변값이라고 설명할 때 , ‘가변성’은 참조형 데이터 자체를 변경할 경우가 아니라, 그 내부의 프로퍼티를 변경할 때만 성립한다.

<br/>

## 5. Undefined 와 Null

### undefined
- ‘값이 없다’, 즉 원시 값도 아니고 객체도 아니라는 뜻이다.
- 개발자가 의도적으로 할당하기 위한 값이 아니라, 자바스크립트 엔진이 변수를 초기화 할 때 사용하는 값이다.
- 변수를 참조 했을 때 undefined 가 반환된다면 참조한 변수선언 이후 값이 할당된 적 없는, 즉 초기화 되지 않은 변수라는 것을 간파 할 수 있다.
- 변수에 값이 없다는 것을 명시하고 싶을 때는 null 을 할당하자.

### null
- ‘객체가 아니다’라는 뜻이다.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

null의 데이터 타입은 object로 알고 있는데요!
'객체가 아니다'가 무슨 의미인지 알 수 있을까요?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

자바스크립트는 일단 자바에서 값을 원시값과 객체로 나눈 접근법을 빌려왔고, 자바에서 '객체가 아님'을 나타내는 값인 null 을 도입해왔다고 합니다.
typeof null 이 object 인거는 자바스크립트 자체의 버그라구 합니다!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

형식상으로는 object이지만 의미상으로는 object가 아니다라는 의미군요! 역설적인 버그네요~

- 값이 없다는 것을 의도적으로 명시(의도적 부재)할 때 사용한다.
- 변수에 Null 을 할당 하는 것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미이다.
- 따라서, 이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거하는 것을 의미하며, 자바스크립트 엔진은 누구도 참조하지 않는 메모리 공간에 대해 가비지 콜렉션을 수행한다.


### 배열과 undefined
- 비어 있는 값에 대해서는 아예 순회조차 돌지 않는다.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

비어있는 값이 어떤건가요? null?

Copy link
Member Author

Choose a reason for hiding this comment

The 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 나 null 을 할당하면, 배열이 인덱스를 이름으로 지정하고 데이터의 주솟값을 저장하는 동작을 하게 되는거죠 ?

따라서, 자바스크립트가 반환해주는 undefined는 문자 그대로의 값이 없음을 나타내는 거고,
프로그래머가 명시적으로 선언해주는 undefined 는 실존하는 값이 된다! 이 말이죠~

- 비어있는 값 !== undefined
- 배열은 결국 객체와 마찬가지로 특정 인덱스에 값을 지정할 때 비로소 빈 공간을 확보하고, 인덱스를 이름으로 지정하고 데이터의 주솟값을 저장하는 동작을 한다.
- 따라서, 값이 지정되지 않은 인덱스(비어있는 배열요소)는 *아직은 존재하지 않는 프로퍼티*에 지나지 않는다.
- 따라서 값으로서 할당된 undefined는 실존하는 데이터인 반면, 자바스크립트 엔진이 반환해주는 undefined는 문자 그대로의 값이 없음을 나타내는 것이다.