JavaScript & Node.js
#.2 Data type
Haksae
2022. 1. 5. 23:38
* Immutable vs Mutable
- Immutable Data type
- 데이터 자체를 변경하지 못하는 것
- primitive types, frozen objects (i.e object.freeze())
- Mutable Data type
- all objects
- JS에서 모든 array는 변경 가능 (다른 언어와 차이점)
1. 변수 (variable) / mutable / rw(read/write)
- 변수 : 변경될 수 있는 값 (mutable)
- let : ES6부터 추가됨
- let name = ‘haksae’
- name = ‘wonssi’
- Block scope
- { }을 사용하면, 블럭 안에 있는 코드는 블럭 밖에서 볼 수 없음.
- 블럭 밖에서 접근해도 아무 값도 나오지 않는다.
- global scope
- 블럭이 아닌, 파일 안에 바로 정의해서 쓴 변수를 global scope이라고 부름
- 어디서나 접근 가능한 변수
- 어플리케이션의 시작부터 끝까지 메모리에 항상 탑재되어있기 떄문에, 필요한 곳에서만 최소한으로 쓰는 것이 좋다.
- var를 쓰면 안되는 이유
- Hoisting
- var로 선언할 것을 항상 제일 위로 선언을 끌어올려주는 것
- 대부분의 프로그래밍은 변수를 선언하고 값을 넣는데, var는 선언하기 전에 값을 할당할 수 있다.
- 심지어 값 할당 전에도 출력 선언도 가능
- block scope가 없다.
- var는 블럭을 무시한다.
- 초장기에는 유연성을 위해서 많이 사용했지만, 프로젝트가 커지면 선언하지도 않은 값이 할당되는 일들이 발생하게 되었다.
- 큰 단점과 리스크 때문에 let 이 나옴
- 호환성 문제
- let은 es6부터 사용되었기에 이전 버전에는 호환이 되지 않는다. (IE 같은 경우..)
- 그러나 BABEL을 이용하면 호환 문제도 해결할 수 있다.
2. 상수 (Contant) / immutable / r(read only)
- 값을 한번 할당(선언)하면 변하지 않음 (immutable)
- const 상수 네임으로 선언함
- ex) const maxNumber = 5;
- immutable type이 좋은 이유 3가지
- favor immutable data type always for a few reasons
- security
- thread safety / 다양한 쓰레드가 동시에 돌아가면서 동시에 변수에 접근해서 값을 변경하는 리스크로부터 막아줌
- reduce human mistakes
- favor immutable data type always for a few reasons
3. Variable types
1) primitive, single item : 더이상 작은 단위로 나눠질 수 없는 한 가지의 아이템을 뜻함
- value로 값이 메모리에 저장
- number, string, boolean, null, undefiedn, symbol
2) object, box container : 싱글 아이템들을 묶은 한 단위, 한 박스로 관리할 수 있게 해주는 것
- object를 가리키는 reference가 메모리에 저장
3) function, first-class function
- JS에서는 함수도 데이터 타입 중 하나
- 함수도 다른 데이터처럼 변수에 할당이 가능하고, 그렇기 때문에 함수의 파라미터로도 전달 가능, 함수에서 리턴 타입으로도 함수를 리턴할 수 있음
- 이것을 first-class function이라고 말함
- 다른 프로그래밍 언어와의 차이
- C언어는 로우 레벨의 언어. 더욱 세세하게 메모리 관리 가능
- java도 동일함
- JS는 let으로 끝남 (number)
4. +- Infinity, NaN
- infinity : 양의(positive) 정수를 0으로 나눌 시
- -infinity : 음의(minus) 정수를 0으로 나눌 시
- NaN : 스트링을 숫자로 나눌 시
5. bigInt (es6부터)
- JS의 number는 -253 ~ 253 까지 가능
- 그 이상은 bigInt
- 숫자에 마지막에 n만 붙이면 됨
- 크롬과 파이어폭스에서만 지원
6. string
- 모든 것을 string으로 받고 따로 타입 선언을 안한다.
- let or const 변수 이름 = value
- template literals(string)
- ${변수 이름}으로 변수를 불러올 수 있음
- `` (backtick)이고, 다른 문자열과 같이 사용 가능
7. boolean
- false : 0, null, undefined, NaN, ‘ ’
- true : any other value
8. null, undefined
- null : null이라고 할당하면, 텅빈 값이라고 지정해주는 것
- undefined : 선언은 되었지만 값이 지정되지 않음. 빈 것인지 정해지지 않은 것
9. Symbol
- const 변수 이름 = Symbol(’id’) ;
- 고유한 식별자가 필요하거나 동시에 다발적으로 일어나는 코드에서 우선순위를 줄 때 사용
- 간혹 식별자를 스트링을 이용해서 쓰는 경우도 있는데, 동일한 스트링을 썼을 때 동일한 식별자로 간주됨
- 스트링이 같아서 동일한 식별자로 만들고 싶다면
- → Symbol.for(’id’); 로 선언 가능
- 심볼은 출력하면 에러가 남
- 항상 symbol1.description 으로 출력해야함
10. Dynamic typing : dynamically typed language
- C나 JAVA는 정적 언어임
- 반면 JS는 동적 언어
- 정적 언어는 변수를 선언할 때 어떤 타입인지 결정해서 타입을 같이 선언하는 것이고, 동적언어는 선언할 때 어떤 타입인지 선언하지 않고 런타임할 때 할당된 값에 따라서 타입이 변경될 수 있다는 것을 의미
- 다이나믹한 언어는 빠르게 프로토 타입을 하고 싶을 떄는 정말 유연하고 좋음
- 그러나 다수의 엔지니어이나 협업할 때 리스크가 있음
11. Object, real-life object, data structure
- const hak = { name: ‘haksae’, age: 33};
- 일상생활에서 보는 물건과 물체들을 대표할 수 있는 박스 형태
- hak은 상수라서 변하지 않지만, 그 안에 값은 할당변수로서 변경 가능