-
자바스크립트 데이터타입(1)Study/JavaScript 2020. 4. 14. 19:26
자바스크립트 데이터타입(1)
프로그래밍언어에서 가장 중요한 것은 무엇인가?
입력, 연산, 출력.
이 세가지가 가장 메인 엑기스이다.
사용자에게 콘솔이나 ui에서 입력받은 데이터를
잘 처리하고 연산해서 알맞게 다시 사용자에게 출력해주는 것이
매우 중요하다.CPU에 최적화된 연산을 사용하는 것도 중요!
메모리의 사용을 최소화 하는 것도 중요! 한 포인트이다.1. Use strict
순수 자바스크립트로 개발할 때에는,
맨 윗줄에'use strict';
를 사용하라.
그래야 자바스크립트가 가지고 있는 유연성을 없앰으로서
프로그래머의 실수를 줄일 수 있고,
자바스크립트 엔진이 조금 더 빠르게 효율적으로 분석할 수 있게 하여 성능개선까지 할 수 있다.2. Variable
let ( added in ES6) - Keyword (이전의 var)
let name = 'bonbon'; console.log(name); name = 'hellol; console.log(name);
'let' 이라는 키워드를 통해 bonbon이라는 변수의 값을 name에 할당하기를 선언함.
어플리케이션을 실행하게 되면, 어플리케이션마다 쓸 수 있는 메모리가 할당되어진다.
메모리는 텅텅 비어져 있는 박스들이다. 어플리케이션마다 쓸 수 잇는 메모리가 제한적으로 할당되어진다.
우리가 let이라는 키워드를 이용해서 name이라는 변수를 정의하게 되면
이렇게 한 개의 박스를 가리킬 수 있는 포인터가 생기게 된다.name이라는 변수가 가리키고 있는 메모리 어딘가에 우리가 bonbon이라는 값을 저장 할 수 있는 것이다. 추후에는 이 name이 가리키는 메모리에 다른 값을 저장 할 수도 있다.
Block scope
{} 중괄호를 이용해서 블럭을 사용하게 되면, 블럭 밖에서는 더이상, 블럭 안에 있는 내용들을 볼 수 가 없다. 이 말은, 콘솔을 이용해서 블럭 밖에서 블럭 안에 있는 내용을 입력을 하면, 아무값도 나오 지 않는다는 말.
{ let name = 'bonbon'; console.log(name); name = 'hello'; console.log(name); } console.log(name);
반대로 이렇게 블록을 사용하지 않고, 파일안에 바로 정의해서 쓰는 변수들을,
global scope 이라고 부른다. 이 아이들은 어디에서나 접근이 가능하다.let globalName = 'global name'; { let name = 'bonbon'; console.log(name); name = 'hello'; console.log(name); console.log(globalName); } console.log(name); console.log(globalName);
블록 안에서 접근해도, 블록 밖에서 접근해도 어디서나 접근 및 출력이 가능함.
global한 변수들은 어플리케이션이 실행되는 순간부터 끝날 때까지 항상 메모리에 탑재되어 있기 때문에 최소한으로 사용하는 것이 좋다. 가능하면 Class나 함수, IF, FOR 등에서 필요한 곳에서만 사용하는 것이 좋다.자바스크립트에서 변수를 선언할 수 있는 키워드는 딱 하나 *'let'**이다. *
var ((Don't ever use this!!))
because , 1) var hoistiong 2) has no block scope
왜 사용하면 안돼냐??!
1) var hoistiong
원래는 선언을 해야 그 변수의 값을 할당하는 것인데,
자바스크립트의 var는 조금 이상한 행동을 할 수있다.바로, 선언도 하기 전에 값을 할당 할 수 있다는 것.
var를 쓰지 않아도 선언이 된다는것...
name = 4; var name;
이 출력이 된다는거... 선언 하기 전에 값을 넣었는데도...
이거를 똑같이 let 키워드에 써본다면,
name = 4; let name;
💀💀💀에러가 발생한다. ((야! 임마!! 선언 하기 전에 값을 넣었잖아??!!)) 하면서..
*이렇게 에러가 나는게 정상적이다. 하지만 var는 선언을 하기도 전에 값을 출력할 수 있다..
참 예외적임.. 참 프로그래머 미치게 만드는 요소..이것을 바로 var hoisting 이라고 한다. (이것은 면접 문제에서도 나올 수 있다. )
Q. var hoisting이란 무엇인가???
A. 네. 호이스팅은 어디에 선언했느냐에 상관없이 항상 제일 위로 선언을 끌어올려주는 것을 말합니다. hoisting = 끌어올려주다
2) has no block scope
var 에게는 block scope이 없다.
이 말은, var는 block scope을 철저히 무시하는 아이다.분명 우리가 var를 이용해서 블록 안에다가 선언했음에도 불구하고
블록 밖에서 접근을 시도할 경우, 어디에서든지 출력이 가능하다!!
어디서나, 아무데서나 보일 수 있음.초창기에는 이런 유연성을 이용해서 대충대충 금방금방 짤 수 있는 어플리케이션을 만들었지만,
어느정도 규모있는 프로젝트를 하다보면 선언하지도 않았던 값들이 할당되는 이런 이상한 애들이 나타나는데 바로 이 var 때문이다. var의 위험부담이 많아서.. let을 사용한다.3. Constant (const)
Constant 값을 한 번 할당하면 값이 절대 바뀌지 않는 아이.
우리가 변수를 이용하면 변수가 메모리 어딘가에 할당된 박스를 가리키고 있어서
포인터를 이용해서 값을 계속 바꾸어 나갈 수 있었다.그러나 이 constant는 이 포인터를 잠궈서 다른 박스를 가리키지 못하게 한다.
https://youtu.be/OCCpGh4ujb8?t=586
값이 변경될 수 있는 것을 Mutable Data type이라고 한다.
바이러스도 계속 Mutation을 통해 계속 유전자의 서열을 바꾸어 나가는 것처럼,데이터 타입도 변경이 가능한 Mutable data type이 바로 우리가 앞에서 살펴 본 let 키워드 변수였다.
그러나 이 constant는 변수가 불가능 하기 때문에 ** Immutable data type**이라 부른다.
그래서 많은 개발자들이 이런말을 주로 한다.
*"favor immutable date type always for a few reasons!"*
왠만하면 값을 할당한 다음에 다시는 변경되지 않는 그런 데이터타입을 사용하라는 말.왜?
1) security - 보안상의 이유
- let 은 한번 작성한 값을 다른 해커들이 이상한 코드의 값을 사용해서 값을 계속 변경해 나가는 것들이 가능하기 때문에.
- immutable data type은 그것을 방지할 수 있다.
2) thread safety -
- 어플리케이션이 실행되면 한가지의 프로세스가 할당이 되고 그 프로세스 안에서는 다양한 thread가 동시에 돌아가면서 어플리케이션을 조금더 효율적으로 동작할 수 있도록 도와줌. 다양한 thread들이 동시에 변수에 접근해서 값을 변경할 수가 있는데 동시에 값을 변경한다는 것은 조금 위험한 것이다. 그래서 가능하다면 값이 변경되지 않는 것을 사용하는 게 좋다.
3) reduce human mistakes
- 앞으로 변경되야될 좋은 이유가 없다면 왠만해서는 const를 이용하는게 좋은데, 내가 나중에 코드를변경하거나 다른 개발자가 코드를 바꿀 때도 실수를 방지해줄 수 가 있다.
정리하자면,
Mutable Data Type Immutable Data Type let constant 'Study > JavaScript' 카테고리의 다른 글
변수 명명 규칙 (0) 2020.04.20 자바스크립트의 엔진은 무엇이며, 어떻게 작동되는 것일까? (0) 2020.04.20 'use strict'; (0) 2020.04.14 조건문(5)__boolean의 대체제 (0) 2020.04.14 조건문(4)__논리 연산자 (0) 2020.04.14