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를 쓰면 안되는 이유
  1. Hoisting
  • var로 선언할 것을 항상 제일 위로 선언을 끌어올려주는 것
  • 대부분의 프로그래밍은 변수를 선언하고 값을 넣는데, var는 선언하기 전에 값을 할당할 수 있다.
  • 심지어 값 할당 전에도 출력 선언도 가능
  1. 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

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은 상수라서 변하지 않지만, 그 안에 값은 할당변수로서 변경 가능

출처 : https://youtu.be/m72yXyaCjf4