{JS} 03.데이터 타입

nana·2022년 11월 12일
0

🟡 JS Deep Dive

목록 보기
4/6
post-thumbnail
  • data type : 7 개의 데이터 타입 제공
    원시 타입/primitive type과 객체 타입/object,reference type으로 분류

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

3.1 숫자 타입

  • 하나의 숫자 타입만 존재
  • 모든 수를 실수로 처리, 정수만 표현하기 위한 데이터 타입 없음
  • 정수, 실수, 2진수, 8진수, 16진수 리터럴은 모두 2진수로 저장
2진수, 8진수, 16진수를 표현하는 데이터 타입은 제공하지 않아 값을 참조하면 10진수로 해석됨  
// 모두 숫자 타입
var integer = 10; // 정수
var double = 10.12; // 실수
var negative = -20; // 음의 정수
var binary = 0b01000001; // 2진수
var octal = 0o101; // 8진수
var hex = 0x41; // 16진수
// 표기법만 다르고 모두 같은 값
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
console.log(4 / 2); // 2
console.log(3 / 2); // 1.5

숫자 타입의 세 가지 특별한 값

1) Infinity : 양의 무한대
2) -Infinity : 음의 무한대
3) NaN : 산술 연산 불가 (not-a-number)

console.log(10 / 0);       // Infiniity
console.log(10 / -0);      // -Infiniity
console.log(1 * 'string'); // NaN

3.2 문자열 타입

  • string : 텍스트 데이터를 나타내는데 사용
  • 작은따옴표 (' '), 큰따옴표 (" ") 또는 백틱 (``)으로 감싼다
  • 키워드나 식별자 같은 토큰과 구분하기 위해, 감싸지 않으면 문자열을 키워드나 식별자 같은 토큰으로 인식
  • 스페이스와 같은 공백 문자도 포함시킬 수 없음
// 문자열 타입
var string;
string = '문자열'; // 작은따옴표
string = "문자열"; // 큰따옴표
string = `문자열`; // 백틱(ES6)
string = '작은따옴표로 감싼 문자열 내의 "큰따옴표"는 문자열로 인식';
string = "큰따옴표로 감싼 문자열 내의 '작은따옴표'는 문자열로 인식";
// 따옴표로 감싸지 않은 hello를 식별자로 인식
var string = hello; // ReferenceError : hello is not defined

3.3 템플릿 리터럴

  • template literal : ES6 부터 도입
  • 멀티라인 문자열, 표현식 삽입, 태그드 템플릿 등 문자열 처리 기능 제공
  • 백틱을 사용해 표현, 런타임에 문자열로 변환되어 처리
ver template = `Template literal`;
console.log(template); // Template literal

3.3.1 멀티라인 문자열

  • 일반 문자열 내에서는 줄바꿈(개행)이 허용되지 않음
var str = 'Hello
world';
// SytaxError : Invalid or unexpected token
  • 문자열 내에서 줄바꿈 등의 공백/white space 를 표현하려면 백슬래시()로 시작하는 이스케이프 시퀀스/escape sequence 사용

    이스케이프 시퀀스의미
    \0Null
    \b백스페이스
    \fForm Feed : 프린터로 출력할 경우 다음 페이지의 시작 지점으로 이동
    \n개행 LF. Line Feed : 다음 행으로 이동
    \r개행 CR. Carriage Return : 커서를 처음으로 이동
    \t탭 (수평)
    \v탭 (수직)
    \uXXXX유니코드, ex) '\u0041'은 A , '\u{1F600}'는 😃
    \'작은따옴표
    \"큰따옴표
    \백슬래시

줄바꿈과 들여쓰기가 적용된 HTML 문자열은 이스케이프 시퀀스를 사용해 작성

var template = '<ul>\n\t<li><a href="#">Home</a></li>\n</ul>';
console.log(template);

❗️출력 결과

<ul>
  <li><a href="#">Home</a></li>
</ul>

템플릿 리터럴 내에서는 이스케이프 시퀀스를 사용하지 않고도 줄바꿈 허용, 공백도 있는 그대로 적용

var template = `<ul>
 <li><a href="#">Home</a></li>
</ul>`;
console.log(template);

❗️출력 결과

<ul>
  <li><a href="#">Home</a></li>
</ul>

3.3.2 표현식 삽입

  • 문자열은 문자열 연산자 + 를 사용해 연결, + 연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작 (그 외의 경우는 덧셈 연산자로 동작)
var first = 'Gil-dong';
var last = 'Hong';
// ES5 : 문자열 연결
console.log('My name is ' + first + ' ' + last + '.');
// My name is GIl-dong Hong.
  • 템플릿 리터런 내에서는 표현식 삽입을 통해 문자열 삽입 가능
var first = 'Gil-dong';
var last = 'Hong';
// ES6 : 표현식 삽입
console.log(`My name is ${first} ${last}.`);
// My name is GIl-dong Hong.
  • 표현식을 삽입하려면 ${ }으로 표현식을 감쌈
  • 표현식의 평가 결과가 문자열이 아니더라도 문자열로 타입이 강제로 변환됨
console.log(`1 + 2 = ${1 + 2}`); // 1 + 2 = 3
  • 표현식 삽입은 반드시 템플릿 리터럴 내에서 사용
  • 템플릿 리터럴이 아닌 일반 문자열에서의 표현식 삽암은 문자열로 취급
console.log('1 + 2 = ${1 + 2}'); // 1 + 2 = ${1 + 2}

3.4 불리언 타입

  • 논리적 참, 거짓을 나타내는 true, false

조건에 의해 프로그램의 흐름을 제어하는 조건문에서 자주 사용

var foo = true;
console.log(foo); // true
foo = false;
console.log(foo); // false

3.5 undefined 타입

  • undefined이 유일한 값
  • var 키워드로 선언한 변수는 암묵적으로 undefined로 초기화됨
    (변수를 선언한 이후 값을 할당하지 않은 변수를 참조하면 undefined가 반환)
var foo;
console.log(foo); // undefined
변수에 값이 없다는 것을 명시하고 싶을 땐 null을 할당

3.6 null 타입

  • null이 유일한 값
  • 대소문자를 구별하므로 주의 (Null, NULL 등과 다름)
  • null은 변수에 값이 없다는 것을 의도적으로 명시할때 사용
    (변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미)
    (이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거하는 것)
var foo = 'Kim';
// 이전 참조를 제거, foo는 더 이상 'Kim'을 참조하지 않음
// 유용해 보이지 않음, 변수의 스코프를 좁게 만들어 변수 자체를 빨리 소멸시키는 편이 낫다
foo = null;
  • 함수가 유효한 값을 반환할 수 없는 경우 명시적으로 null 반환하기도 함

ex) HTML 요소를 검색해 반환하는 document.querySelector 메서드는 조건에 부합하는 요소를 검색할 수 없는 경우 에러 대신 null 반환

<!DOCTYPE html>
<html>
<body>
  <script>
   var element = document.querySelector('.myClass');
   // HTML 문서에 myClass 클래스를 갖는 요소가 없으면 null 반환
   console.log(element); // null
  </script>
</body>
</html>

3.7 심벌 타입

  • symbol : ES6에서 추가된 7번째 타입
  • 변경 불가능한 원시 타입의 값, 다른 값과 중복되지 않는 유일무이한 값
    주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용
  • 심벌 이외의 원시 값은 리터럴을 통해 생성하지만 심벌은 symbol 함수를 호출해 생성 (심벌 값은 외부에 노출되지 않음)
// 심벌 값 생성
var key = symbol('key');
console.log(typeof key); // symbol
// 객체 생성
var obj = { };
// 이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용
obj[key] = 'value';
console.log(obj[key]); // value

3.8 객체 타입

  • 데이터 타입은 크게 원시 타입과 객체타입으로 분류
  • 자바스크립트는 객체 기반의 언어이며, 자바스크립트를 이루고 있는 거의 모든 것이 객체
  • 앞 6가지 데이터 타입 이외의 값은 모두 객체 타입

3.9 데이터 타입의 필요성

3.9.1 데이터 타입에 의한 메모리 공간의 확보와 참조

var score = 100;

위 코드가 실행되면,

  • 메모리 공간 확보 : 몇 바이트의 메모리 공간을 사용해야 낭비와 손실 없이 값을 저장할 수 있는지 알아야함

    -> 리터럴 100을 숫자 타입의 값으로 해석
    -> 숫자 타입의 값 100을 저장하기 위해 8바이트의 메모리 공간을 확보
    -> 확보된 메모리에 숫자 값 100을 2진수로 저장

:: 변수에 할당되는 값의 데이터 타입에 따라 확보해야할 메모리 공간의 크기가 결정됨
  • 참조 : 식별자 score를 통해 숫자 타입의 값 100이 저장되어 있는 메모리 공간의 주소를 찾아갈 수 있음
    참조하려면 한 번에 읽어 들여야 할 메모리 공간의 크기 (메모리 셀의 개수/바이트 수)를 알아야함
:: 변수에 숫자 타입의 값이 할당되어 있어 score 변수를 숫자 타입으로 인식
:: 숫자 타입은 8바이트 단위로 저장되므로 score 변수를 참조하면 8 바이트 단위로 메모리 공간에 
   저장된 값을 읽음

3.9.2 데이터 타입에 의한 값의 해석

  • 해석 : 모든 값은 데이터 타입을 가지며 비트에 나열로 저장됨
    저장된 값은 데이터 타입에 따라 다르게 해석될 수 있음
:: score 변수에 할당된 값은 숫자 타입의 값
:: 참조하면 메모리 공간의 주소에서 읽어 들인 2진수를 숫자로 해석

❗️데이터 타입이 필요한 이유

  • 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해
  • 값을 참조할 때 한 번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해
  • 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해

3.10 동적 타이핑

3.10.1 동적 타입 언어와 정적 타입 언어

1. 정적 타입(static/strong type) 언어

  • 변수를 선언할 때 변수에 할당할 수 있는 데이터 타입을 사전에 선언 (명시적 타입 선언)
  • 변수의 타입을 변경할 수 없고 변수에 선언한 타입에 맞는 값만 할당 가능
  • 정적 타입 언어 : C, C++, Java, Kotlin, Go 등...

2. 동적 타입 (dynamic/weak type) 언어

  • 자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정 (타입 추론)
  • 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있음 (동적 타이핑)
  • 동적 타입 언어 : JavaScript, Python, PHP, Ruby 등...

3.10.2 동적 타입 언어와 변수

  • 변수에 어떤 데이터 타입의 값이라도 자유롭게 할당 가능
  • 변수 값은 언제든지 변경될 수 있어 유연성은 높지만 신뢰성은 떨어짐

❗️변수를 사용할 때 주의할 점

  • 변수는 필요한 경우에 한해 제한적으로 사용, 무분별한 남발은 금물
  • 유효 범위(스코프)는 최대한 좁게 만들어 변수의 부작용 억제
  • 전역 변수는 최대한 사용하지 않는다
    (어디서든지 참조/변경 가능한 전역 변수는 의도치 않게 값이 변경될 가능성이 높아 다른 코드에 영향을 줄 가능성도 높다)
  • 변수보다는 상수를 사용해 값을 변경을 억제
  • 변수 이름은 변수의 목적이나 의미를 파악할 수 있도록 네이밍한다
profile
✧ 중요한건 꺾이지 않는 마음 🔥 ᕙ(•ө•)ᕤ 🔥

0개의 댓글