deep dive - 문, 데이터 타입

CH_Hwang·2024년 5월 21일
0

deep-dive

목록 보기
3/6

문(statement)

  • 문은 프로그램을 구성하는 기본 단위이자 최소 실행 다누이다.
  • 문은 여러 토큰으로 구성된다.
    - 토큰은 문법적 의미를 가지며 문법적으로 더 이상 나눌 수 없는 기본요소를 의미한다
const sum = 1 + 2;

위 코드에서 const, sum, =, 1, +, 2, ; 는 모두 토큰이며 이것들의 집합이 문이다.

문은 선언문, 할당문, 조건문, 반복분 등으로 구분할 수 있다.

표현식인 문과 표현식이 아닌 문

let x;

x = 1 + 2;;

위 코드에서 let x;는 문이지만 값으로 평가될 수 없으므로 표현식이 아니다. 그러나 x = 1 + 2;는 표현식이므로 완전한 문이기도 하다.

데이터 타입

데이터 타입은 값의 종류를 말하며 원시타입과 객체 타입으로 나뉜다.

구분데이터 타입설명
원시 타입숫자 타입(number)숫자, 정수와 실수 구분 없이 하나의 숫자 타입만 존재
문자열 타입(string)문자열
불리언 타입(boolean)논리적 참, 거짓 - true, false
undefined 타입(undefined)var, let으로 선언된 변수에 암묵적으로 할당되는 값 (let x;)
null 타입 (null)값이 없다는 것을 의도적으로 명시할 떄 사용하는 값
심벌 타입(Symbol)ES6에서 추가된 7번째 타입
객체타입객체,함수, 배열 등

숫자 타입(number)

C, 자바는 정수, 실수를 구분하여 int, float 등으로 타입이 나뉘지만 javascript는 그저 number밖에 없다.

ECMAScript 사양에 따르면 숫자 타입은 배정밀도 64비트 부동소수점 형식을 따른다.

  • 이말은 모든 수를 실수로 처리한다는 뜻이다.

배정밀도 64비트 부동소수점

  • 메모리에 모두 2진수로 저장한다.
  • 부동소수점은 소수점이 고정되어있지 않고 좌우로 움직일 수 있다.
  • 64비트 안에 긴 소수점까지 표현해야되기 때문에 근사값을 사용하여 정확한 값이 아닐 수 있다.
    • 순환소수 형태의 경우 이진수에서 가수부인 53비트를 넘어버리기때문에 53번째 비트에서 반올림 하여 표현하기 때문에 정확하지 않다.

자바스크립트에서 2진수, 8진수, 16진수 모두 2진수로 저장되고 따로 데이터 타입이 존재하지 않기때문에 값을 참조하면 10진수로 해석된다.

const binary = 0b01000001;
const octal = 0o101;
const hex = 0x41;

console.log(binary); // 65
console.log(octal); // 65
console.log(hex); // 65
console.log(binary === octal) // true
console.log(octal === hex) // true
console.log(1 === 1.0) // true -> 모두 실수로 처리하기 때문에

숫자 타입은 추가적으로 3가지 특별한 값도 있다.

  • Infinity
  • -Infinity
  • NaN

문자열 타입(string)

텍스트 데이터.
'',"",백틱(``)으로 텍스트를 감싸서 사용한다.

const string = 'hello';
const string2 = world // ReferenceError: world is not defined -> 감싸지 않으면 식별자로 인식해버린다.

템플릿 리터럴

ES6에 나온 문자열 표기법이다.
문자열 안에서 여러가지 편리한 기능을 제공준다.

멀티라인

일반 문자열에서는 줄바꿈이 허용되지 않아 escape sequnce를 사용해야한다.

//X
const string = 'hello
world'; //SyntaxError: Invalid or unexpected token

//O
const stirng2 = 'hello \n world';

반면 템플릿 리터럴은 그냥 띄워써도 된다.

const string = `hello
world`;

console.log(string) 
// hello
// world

표현식 삽입

일반 문자열은 +를 이용하여 연결한다.

const post = 'world';

console.log('hello' + post); // hello world

템플릿 리터럴은 ${}을 사용하여 문자열 중간에 표현식을 삽입할 수 있다.

const post = 'world';
console.log(`hello ${wolrd}`); // hello world

function sum(a,b){
 return a+b 
}
console.log(`1 + 2 = ${sum(1,2)}`) // 1 + 2 = 3

불리언 타입 (Boolean)

true와 false가 있다.

const foo = true;
const bar = false;

undefined 타입 (undefined)

undefined가 유일하다.

var 키워드로 선언 했을 때변수 선언 시 undefined로 초기화한다. (호이스팅의 사이드이펙트가 일어나는 주 원인이기도 하다. 다른 const, let의 경우 호이스팅이 일어나지만 초기화가 되지 않아 Temporal Dead Zone에 걸려 에러가 나기 때문이다.)

undefined는 이름에서부터 알 수 있듯 아직 할당되지 않은, 초기화 되지 않은 변수라는 것을 명시적으로 알려준다.
그렇기 때문에 값이 없다는 것을 명시하고 싶을 때는 null을 할당한다.

null 타입 (null)

null이 유일하다.

값이 없다는 것을 의도적으로 명시할 때 사용한다.

let foo = 'hello';

foo = null;

이렇게 하면 foo는 더이상 'hello'를 참조하지 않으며 더이상 아무도 'hello'를 참조하지 않으면 자바스크립트 엔진이 가비지 콜렉션을 수행한다.

심벌 타입

ES6에서 추가된 7번째 타입이다. 변경 불가능한 원시 타입이며 다른 값과 중복되지 않는 유일무이한 값이다.
심벌 이외의 원시값들은 리터럴을 통해 생성하지만 심벌은 Symbol 함수를 호출해서 생성한다.

객체 타입

책에서는 추후 서술하기로 되어있으며 잠시 맛보기로 조금 설명해보자면 주소값을 참조로 하는 참조타입이라는 점이 원시타입과의 차이점인 것 같다.

데이터 타입의 필요성

왜 필요하냐..?

메모리최적화

  • 메모리에 저장하려면 먼저 메모리 공간의 크기를 정해야한다.
    • 데이터 타입에 따라 필요한 메모리 공간을 계산하고 확보해놓기 때문에 미리 공간을 확보하기 위함이다.
  • 값을 참조 하는 경우 식별자를 통해 메모리 공간의 주소를 찾아갈 수 있다.
    • 이때 값을 참조하려면 한 번에 읽어 들여야 할 메모리 공간의 크기(메모리 셀의 개수, 바이트 수)를 알아야하고 이를 통해 값이 훼손되지 않고 잘 읽어들일 수 있다.

값의 해석

메모리에서 읽어 들인 것은 그저 0과 1, 이진수로 되어있다.
데이터 타입을 통해 어떤 값으로 보여줄 것인지를 결정할 수 있다.

동적 타이핑

자바스크립트에서 변수 선언은 타입으로 선언하지 않고 var, let, const 만을 사용한다. 그래서 어떠한 데이터 타입의 값이라도 자유롭게 할당할 수 있다.

좋은지 잘 모르겠다. 유연하게 코드를 짤 수 있어 속도면에서 장점을 가질 수 있지만... 레거시가 되고 하면 엄청난 사이드 이펙트가 있을 수 있다..

let string = '1'; // string
string = 5; // number
string = true // boolean
...

자바스크립트의 변수는 선언이 아니라 할당에 의해 타입이 추론되어 결정되기 때문에 재할당 될때마다 타입이 변경될 수 있는 동적 타이핑을 지원한다.

주의점

  • 재할당에 의해 타입이 언제든 변경될 수 있으므로 필요한 만큼만 사용한다.
  • 변수의 scope를 최대한 좁게 만들어 사이드이펙트를 최소하한다.
  • 전역 변수는 최대한 사용하지 않도록 한다.
  • 상수를 최대한 사용한다.
  • 변수 이름은 변수의 목적, 의미를 파악할 수 있도록 네이밍한다.

0개의 댓글