하다보니

[JavaScript]데이터 타입, let vs var, hoisting 본문

프로그래밍 언어/JavaScript

[JavaScript]데이터 타입, let vs var, hoisting

claire 2022. 1. 11. 17:00

입력 연산 출력이 프로그램의 핵심!

cpu에 최적화된 로직을 구현하고, 메모리의 사용을 최소화 하는 것도 중요하다. 

let

ES6에 추가된 개념이다. 자바스크립트에서 변수를 선언할 수 있는 유일한 방법. var는 선언 전에 값을 할당할 수 있다. 심지어 값 할당 전에 출력도 할 수 있다. 에러가 발생하지 않는다는 것이다. 이것을 var hoisting이라고 한다. 또한 var는 block scope이 없다. 즉, block을 철저히 무시한다. 블록 안에 있어도 외부에서 접근이 가능하다. 

 

constant

변수를 이용하면 변수가 메모리 어딘가에 할당된 박스를 가리키고 있어서 포인터를 이용해서 값을 계속 바꿀 수 있었다. constants는 이 포인터가 잠겨있다. 그래서 값을 선언함과 동시에 할당한 뒤로는 절대 다시 값을 변경할 수 없다. 값을 바꿀 수 있는 것을 mutable data type이라고 한다. 

favor immutable data type always.

1. security

2. thread safety -  다양한 스레드들이 동시에 변수에 접근해서 값을 변경할 수 있는데 이것은 위험해서 가능하면 constants를 사용하는 것이 좋다.

만약 앞으로 값이 변경되지 않는다면 const를 쓰느 것이 좋다. 

 

Variable types
  • primitive type - 더이상 작은 단위로 나눠질 수 없는 한가지 아이템(single item) : number, string, boolean, null, undefined, symbol, 값 자체가 메모리에 저장된다. Immutable type. 데이터 자체를 변경하는 것은 불가능. 
  • object type - 위의 single item들을 박스로 묶어서 관리할 수 있게 해주는 것이다. 크기가 커서 메모리에 한번에 올라갈 수가 없다. reference를 통해서 실제 object가 담겨있는 메모리를 가리킨다. 즉, 오브젝트를 가리키는 reference가 메모리에 저장된다. object 중 object.freeze()는 변경이 불가능해서 immutable type이지만 기본적으로 모든 object는 변경이 가능하므로 mutable data type이다. 

  • function, first-class function

First-class Function 란

프로그래밍 언어가 함수를 First-class citizen으로 취급하는 것을 말한다.
함수를 First-class citizen으로 취급 가능하다고 하는 것은 다음을 뜻한다.

  • 함수를 변수나 자료구조에 저장할 수 있다.
  • 함수의 매개변수(인자)에 다른 함수를 인수로 전달할 수 있다.
  • 함수의 반환 값(return 값)으로 함수를 전달할 수 있다.

c언어는 low level 언어. 개발자가 프로그램을 짜면서 세세하게 메모리를 관리할 수 있다.  변수의 자료형을 필요한 크기에 따라 선언한다. 하지만 자바스크립트는 number만 사용해서 숫자를 쓴다. 심지어 자바스크립트에서는 타입이 다이나믹하게 결정이 되기 때문에 let으로 선언해주면 된다. 하지만 타입스크립트에서는 let a: number=12; 이렇게 명확하게 타입을 명시해야한다. 

 

1/0 은 Infinity, -1/0 은 -Infinity, 'not a number'/2는 NaN이 나온다. 

 

최근에 bigint 타입이 추가되었다. 큰 숫자에 n만 붙이면 된다. 원래 js에서는 (-2**53~2**53) 범위의 숫자만 표현이 가능했다. 이건 최근에 추가된 것이라 아직 다 지원하지는 않는다. 그리고 너무 큰 숫자라 흔히 쓰이지는 않는다. 

 

string은 문자, 문자열 모두 해당.

`hello ${a}` 백틱 기호로 문자열 사이에 변수를 쓸 수 있다. 

 

boolean 타입 - false : 0,null, undefined,nan,'' , 나머지는 true. 

 

null은 명확하게 비어있는 값이고 undefined는 선언은 되었지만 값이 지정되어있지 않은 상태를 말한다.

 

 

symbol은 동일한 string도 다른 것으로 만들어주어 string에 상관없이 고유한 식별자로 나타내준다. symbol.for는 해당 문자열에 해당하는 심볼을 만들어준다. 따라서 아래 코드에서 첫번째 출력은 false가 나오고 두번째 출력은 true가 나온다. 

심볼은 symbol.description으로 string으로 바꾼 후 출력을 해야한다. symbol은 고유한 식별자가 필요할 때 사용한다. 

자바스크립트는 프로그램이 동작할 때 할당된 값에 따라서 타입이 변경될 수 있다는 것을 얘기한다. dynamically typed language. 아래의 코드가 그 예시이고 이 특성때문에 오류가 나오기도 한다. 

위 코드 출력

 

이러한 문제점으로 타입스크립트가 나오게 되었다. 

 

object는 박스 형태를 말한다. object 자체는 const로 선언되어 다른 값으로 변경이 불가하지만 object안에 존재하는 변수는 변경이 가능하다. 

 

hoisting

hoisting은 어디에 선언했는지 상관없이 제일 위로 선언을 끌어 올려주는 것. 

Block Scope

block은 밖에서 접근이 불가능하다. 글로벌 변수는 블록 안에서도 접근 가능.  글로벌 변수는 어플리케이션이 끝날 때까지 메모리에 탑재되어 있기 때문에 최소한으로 사용하는 것이 좋다. 

 

 

 

출처 : 유튜브 드림코딩 by 엘리