자바스크립트(데이터 타입)

이선민·2021년 7월 13일
0

데이터 타입

  • 데이터 타입(data type)은 값의 종류를 말한다. 자바스크립트의 모든 값은 데이터 타입을 갖는다.

원시 타입

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

객체 타입

  1. 객체, 함수, 배열 등

숫자 타입

  • C나 자바의 경우, 정수(소수점 이하가 없는 숫자)와 실수(소수점 이하가 있는 숫자)를 구분해서 int, long, float, double 등과 같은 다양한 숫자 타입을 제공한다.

    // 모두 숫자 타입이다.
    var integer = 10; // 정수
    var double = 10.12 // 실수
    var negative = -20; // 음의 정수

    정수, 실수, 2진수, 8진수, 16진수 리터럴은 모두 메모리에 배정밀도 64비트 부동소수점 형식의 2진수로 저장된다.

    자바스크립트는 2진수, 8진수, 16진수를 표현하기 위해 테이터 타입을 제공하지 않기 때문에 아들 값을 참조하면 10진수로 해석된다.

    • 자바스크립트의 숫자 타입은 정수만을 위한 타입이 없고 모든 수를 실수로 처리한다. 이는 정수로 표시된다 해도 사실은 실수라는 것을 의미한다.

      따라서, 정수로 표시되는 수끼리 나누더라도 실수가 나올 수 있다.

      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)

      ```jsx
      // 숫자 타입의 세 가지 특별한 값
      console.log(10 / 0); // Infinity
      console.log(10 / -0); // -Infinity
      console.log(1 * "String"); // NaN
      ```

      문자열 타입

    • 문자열(String) 타입은 텍스트 데이터를 나타내는 데 사용한다.

    • 문자열은 작은따옴표(' '), 큰따옴표(" ") 또는 백틱( )으로 텍스트를 감싼다. 자바스크립트에서 가장 일반적인 표기법은 작은따옴표를 사용하는 것이다.

      ```jsx
      // 문자열 타입
      var string;
      string = '문자열'; // 작은따옴표
      string = "문자열"; // 큰따옴표
      string = `문자열`; // 백틱(ES6)
      string = '작은따옴표로 감싼 문자열 내의 "큰따옴표"는 문자열로 인식된다.';
      string = "큰따옴표로 감싼 문자열 내의 '작은따옴표'는 문자열로 인식된다.";
      ```

      템플릿 리터럴

    • ES6부터 템플릿 리터럴(template literal)이라고 하는 새로운 문자열 표기법이 도입되었다.

      템플릿 리터럴은 멀티라인 문자열(multi-line string), 표현식 삽입(expression interpolation), 태그드 템플릿(tagged template) 등
      
      편리한 무자열 처리 기능을 제공한다. 템플릿 리터럴은 런타임에 일반 문자여롤 변환되어 처리된다.
      
      ```jsx
      var teamplate = `Template literal`;
      console.log(template); // Template literal
      ```
      
      ### 멀티라인 문자열
      
      - 일반 무자열 내에서는 줄바꿈(개행)이 허용되지 않는다.
      
      ```jsx
      var str = 'Hello
      world.';
      // SyntaxError: Invalid or unexpented token
      ```

      표현식 삽입

    • 문자열은 문자열 연산자 +를 사용해 연결할 수 있다. +연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작한다.

      그 외의 경우는 덧셈 연산자로 동작한다.

      var first = 'Sun-min';
      var last = 'Lee';
      
      // ES5: 문자열 연결
      console.log('My name is ' + first + ' ' + last + '.'); // My name is Sun-min Lee.
      // ES6: 표현식 삽입
      console.log(`My name is ${first} ${last}.`); // My name is Sun-min Lee.
    • 표현식 삽입은 반드시 템플릿 리터럴 내에서 사용해야 한다. 템플릿 리터널이 아닌 일반 문자열에서의 표현식 삽입은 문자열로 취급된다.

      ```jsx
      console.log('1 + 2 = ${1 + 2]'); // 1 + 2 = ${1 + 2}
      
      console.log(`1 + 2 = ${1 + 2}`); // 1 + 2 = 3
      ```

      불리언 타입

    • 불리언 타입의 값은 논리적 참, 거짓을 나타내는 true와 false뿐이다.

      ```jsx
      var foo = true;
      console.log(foo); // true
      
      foo = false;
      console.log(foo); // false
      ```
      
      불리언 타입의 값은 참과 거짓으로 구분되는 조건에 의해 프로그램의 흐름을 제어하는 조건문에서 자주 사용한다.

      undefined 타입

    • undefined 타입의 값은 undefined가 유일하다.

    • var 키워드로 선언한 변수는 암묵적으로 undefined로 초기화된다.

    • 변수를 선언한 이후 값을 할당하지 않은 변수를 참조하면 undefined가 반환된다

      var foo;
      console.log(foo); // undefined

      변수에 값이 없다는 것을 명시하고 싶을 때는 undefined를 할당하는 것이 아니라 null을 할당한다.

null 타입

  • null 타입의 값은 null이 유일하다.
  • 프로그래밍 언어에서 null은 변수에 값이 없다는 것을 의도적으로 명시(의도적 부재 intentional absence)할 때 사용한다.
  • 변수에 null을 할당하는 것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미다.

심벌 타입

  • 심벌(symbol)은 ES6에서 추가된 7번째 타입으로, 변경 불가능한 원시 타입의 값이다. 심벌 값은 다른 값과 중복되지 않는 유일무이한 값이다.
  • 주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용한다.
  • Symbol 함수를 호출해 생성한다. 이 때 생성된 심벌값은 외부에 노출되지 않으며, 다른 값과 절대 중복되지 않는 유일무이한 값이다.
// 심벌 값 생성
var key = Symbol('key');
console.log(typeof key); // symbol

// 객체 생성
var obj = {};

// 이름이 충돌할 위험이 없는 유일무이한 값이 심벌을 프로퍼티 키로 사용한다.
obj[key] = 'value';
console.log(obj[key]); // value

객체 타입

  • 자바스크립트는 객체 기반의 언어이며, 자바스크립트를 이루고 있는 거의 모든 것이 객체이다.

데이터 타입의 필요성

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

    값은 메모리에 저장하고 참조할 수 있어야 한다. 메모리에 값을 저장하려면 먼저 확보해야 할 메모리 공간의 크기를 결정해야 한다.

    다시 말해, 몇 바이트의 메모리 공간을 사용해야 낭비와 손실 없이 값을 저장할 수 있는지 알아야 한다.

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

    모든 값은 테이터 타입을 가지며, 메모리에 2진수, 즉 비트의 나열로 저장된다. 메모리에 저장된 값은 데이터 타입에 따라 다르게 해석될 수 있다.

  • 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해

  • 값을 참조할 때 한 번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해

  • 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해

동적 타이핑

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

  • C나 자바 같은 정적 타입(static/strong type)언어는 변수를 선언할 때 변수에 할당할 수 있는 값의 종류, 즉 데이터 타입을 사전에 선언해야 한다.

    이를 명시적 타입 선언(explicit type declaration)이라 한다.

  • 정적 타입 언어는 변수의 타입을 변경할 수 없으며, 변수에 선언한 타입에 맞는 값만 할당할 수 있다.

  • 정적 타입 언어는 컴파일 시점에 타입 체크(선언한 데이터 타입에 맞는 값을 할당했는지 검사하는 처리)를 수행한다.

  • 만약 타입 체크를 통과하지 못했다면 에러를 발생시키고 프로그램의 실행 자체를 막는다.

  • 이를 통해 타입의 일관성을 강제함으로써 더욱 안정적인 코드의 구현을 통해 런타임에 발생하는 에러를 줄인다.

  • 대표적인 정적 타입 언어 → C, C++, 자바(Java), 코틀린(Kotlin), 고(Go), 하스켈(Haskell), 러스트(Rust), 스칼라(Scala) 등이 있다.

typeof

  • typeof 연산자로 변수를 선언하면 변수의 데이터 타입을 반환한다. 정확히 말하면 변수의 데이터 타입을 반환하는 것이 아니라

    변수에 할당된 갓의 데이터 타입을 반환한 것이다.


  • 자바스크립트의 변수에는 어떤 데이터 타입의 값이라도 자유롭게 할당할 수 있으므로 정적 타입 언어에서 말하는 데이터 타입과 개념이 다르다.

    정적 타입 언어는 변수 선언 시점에 변수의 타입이 결정되고 변수의 타입을 변경할 수 없다.

    자바스크립트에서는 값을 할당하는 시점에 변수의 타입이 동적으로 결정되고 변수의 타입을 언제든지 자유롭게 변경할 수 있다.

  • 자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론)된다. 그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다.

    이러한 특징을 동적 타이핑(dynamic inference)이라 하며, 자바스크립트를 정적 타입 언어와 구별하기 위해 동적 타입(dynamic/week type)언어라 한다.

  • 대표적인 동적 타입 언어로는 자바스크립트, 파이썬(Python), PHP, 루비(Ruby), 리스프(Lisp), 펄(Perl) 등이 있다.

동적 타입 언어와 변수

  • 변수는 꼭 필요한 경우에 한해 제한적으로 사용한다. 변수 값은 재할당에 의헤 언제든지 변경될 수 있다. 이로 인해 동적 타입 언어인 자바스크립트는

    타일을 잘못 예측해 오류가 발생할 가능성이 크다. 변수의 개수가 많으면 많을수록 오류가 발생할 확률도 높아진다.

    따라서 변수의 무분별한 남발은 금물이며, 필요한 만큼 최소한으로 유지하도록 주의해야 한다.

  • 전역 변수는 최대한 사용하지 않도록 한다. 어디서든지 참조/변경 가능한 전역 변수는 의도치 않게 값이 변경될 가능성이 높고 다른 코드에 영향을 줄

    가능성도 높다. 따라서 전역 변수는 프로그램의 복잡성을 증가시키고 처리 흐름을 추적하기 어렵게 만들고, 오류가 발생할 경우 오류의 원인을 특정하기

    어렵게 만든다.

  • 변수보다는 상수를 사용해 값의 변경을 억제한다.

  • 변수 이름은 변수의 목적이나 의미를 파악할 수 있도록 네이밍한다. 변수 이름뿐 아니라 모든 식별자(변수, 함수, 클래스 이름 등)는 존재 이유를 파악할 수 있는

    적절한 이름으로 지어야 한다.

  • 개발자의 의도를 나타내는 명확한 네이밍은 코드를 이해하기 쉽게 만들고, 이는 협업과 생산성 향상에 도움을 준다.

  • 사람이 이해할 수 있는 코드, 즉 가독성이 좋은 코드가 좋은 코드다.

0개의 댓글