JS

[ JS 딥다이브 ] 3주차 : 데이터 타입

핏짜보이 2023. 3. 5. 12:30
반응형

 

  • 데이터 타입 : 값의 종류(JS의 모든 값은 데이터 타입을 갖고 있음)
1. 숫자 타입

다른 언어(JAVA, C)와 다르게 JS는 단

하나의 숫자 타입만 존재

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

→ 즉,

모든 수를 실수

로 처리하고, 정수만 표현하기 위한 데이터 타입이 별도로 존재하지 않음

⇒ 정수로 표시가 된다고 해도 사실은 실수라는 것을 의미함 (👉🏾 정수로 표시되는 수끼리 나누더라도 실수가 나올 수 있음!)

 

 

+ 숫자 타입은 추가적으로 아래 세가지 특별한 값도 표현 가능

  • Infinity : 양의 무한대
  • -Infinity : 음의 무한대
  • NaN : 산술 연산 불가 (Not - a -Number) → JS는 대소문자 구분을 하기 때문에 NAN, Nan, nan과같이 표현하면 에러 발생

 

2. 문자열 타입
  • 문자열 타입은 텍스트 데이터를 나타내는데 사용
  • 문자열은 0개 이상의 16비트 유니코드 문자(UTF-16)의 집합으로 전 세계 대부분의 문자를 표현할 수 있음
  • 문자열은 작은 따옴표(’’) / 큰 따옴표(””) / 백틱 (``)으로 감싼다 → 이유 : 키워드나 식별자 같은 토큰과 구분하기 위함
    • 만약 문자열을 따옴표로 감싸지 않으면 JS엔진은 문자열을 키워드나 식별자 같은 토큰으로 인식함
  • JS의 문자열 : 원시타입이고, 변경 불가능한 값

 

 

3. 템플릿 리터럴 : 백틱으로 문자열을 감싸고 ${ } 안에 변수를 바로 넣어서 표현하는 문자열 표기법
  • ES6에서 추가된 새로운 문자열 표기법
  • 템플릿 리터럴은 런타임에 일반 문자열로 변환되어 처리됨

 

1) 멀티라인 문자열

일반 문자열 내에서는 개행(줄바꿈)이 허용되지 않음

let string = 'hello world!'; // syntaxError 

일반 문자열 내에서 줄바꿈 등의 공백을 표시하려면 백슬래시(\)로 시작하는 이스케이프 시퀀스를 사용해야 함.

 

2) 표현식 삽입

let first = 'hello' let last = 'world'  // ES5의 문자열 연결 console.log('Say to ' + first + ' ' + last) // Say to hello world  // ES6의 표현식 삽입 console.log(`Say to ${first} ${last}`) // Say to hello world 
  • 표현식을 삽입하려면 ${ } 로 표현식을 감싼다 → 이때 표현식의 평가 결과가 문자열이 아니더라도 문자열로 타입이 강제 변환되어 삽입 된다
  • 표현식의 삽입은 반드시 템플릿 리터럴 내에서 아용해야 함. 템플릿 리터럴이 아닌 일반 문자열에서의 표현식 삽입은 문자열로 취급.
console.log(`1 + 2 = ${1 + 2}`) // 1 + 2 = 3  console.log('1 + 2 =  ${1 + 2}') // 1 + 2 = ${1 + 2}

 

 

4. 불리언 타입
  • 불리언 타입의 값은 참/ 거짓을 나타내는 true, false
let foo = true console.log(foo) // true  foo = false console.log(foo) // false

 

 

5. undefined 타입
  • undefined 타입의 값은 undefined가 유일함
  • var 키워드로 선언한 변수는 암묵적으로 undefined로 초기화됨.
  • 즉, 변수 선언에 의해 확보된 메모리 공간을 처음 할당이 이루어질 때까지 비어있는 상태로 내버려두지 않고 JS엔진이 undefined로 초기화 함.
  • 따라서 변수를 선언한 이후 값을 할당하지 않은 변수를 참조하면 undefined 반환됨

이처럼 undefined는 개발자가 의도적으로 할당하기 위한 값이 아니라 자바스크립트 엔진이 변수를 초기화할 때 사용하는 값이다.

→ 변수를 참조했을 때 undefined가 리턴된다면 초기화되지 않은 변수.

if) 변수에

값이 없다는 것

을 명시하고 싶을때에는

null

으르 할당!

 

 

6. null 타입
  • null 타입의 값은 null이 유일함.
  • JS는 대소문자를 구별하므로 nulldms Null / NULL등과 다름

→ 프로그래밍 언어에서 null은 변수에 값이 없다는 것을 의도적으로 명시(의도적 부재)할 때 사용함

 

if(변수에 null을 할당하는 것) == 변수가 이전에 참조하던 값을 더이상 참조하지 않겠다는 의미

→ 이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거하는 것을 의미하고, JS엔진은 누구도 참조하지 않는 메모리 공간에 대해

가비지 콜렉션

을 수행할 것

 

 

7. 심벌 타입
  • 심벌 타입은 ES6에서 추가된 7번째 타입으로, 변경 불가능한 원시 타입의 값
  • 심벌 값은 다른 값과 중복되지 않는 유일무이한 값

⇒ 따라서 주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용함

  • 심벌 이외의 원시 값은 리터럴을 통해 생성하지만 심벌은 Symbol함수를 호출해 생성함/ 이때 생성된 심벌 값은 외부에 노출되지 않으며, 다른 값과 절대 중복되지 않는 유일한 값!
// 심벌 값 생성 let key = Symbol('key') console.log(typeof key) // symbol  // 객체 생성 let obj = {}  // 이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용함 obj[key] = 'value' console.log(obj[key]) // value

 

8. 객체 타입
  • JS는 객체 기반의 언어이며, JS를 이루고 있는 거의 모든 것객체이다.

 

 

9. 데이터 타입의 필요성

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

  • 값은 메모리에 저장하고 참조할 수 있어야 함.
  • 메모리에 값을 저장하려면 먼저 확보해야 할 메모리 공간의 크기를 결정해야 함→ 즉, 몇 바이트의 메모리 공간을 사용해야 낭비와 손실 없이 값을 저장할 수 있는지 알아야 함
let score = 100
  • 위 코드가 실행되면 컴퓨터는 숫자값 100을 저장하기 위해 메모리 공간 8바이트 확보
  • 확보된 메모리에 숫자값 100을 2진수로 저장→ 이런 처리를 하기 위해서는 숫자 값을 저장할 때 확보해야 할 메모리 공간의 크기를 알아야 함
  • JS엔진은 데이터 타입, 즉 값의 종류에 따라 정해진 크기의 메모리 공간을 확보함

 

if) 값을 참조하는 경우

  • 식별자 score를 통해 숫자 타입의 값 100이 저장되어 있는 메모리 공간의 주소를 찾아갈 수 있음
  • 숫자값 100이 저장되어 있는 메모리 공간의 선두 메모리 셀의 주소를 찾아갈 수 있음→ 이때 값을 참조하려면 한번에 읽어 들여야 할 메모리 공간의 크기, 즉 메모리 셀의 개수(바이트 수)를 알아야 함→ score 변수에는 숫자 타입의 값이 할당되어 있어서, JS 엔진은 score 변수를 숫자 타입으로 인식
  • → 숫자 타입은 8바이트 단위로 저장되므로 score 변수를 참조하면 8바이트 단위로 메모리 공간에 저장된 값을 읽어들인다.
  • → score 변수의 경우, 저장되어 있는 값이 숫자 타입이므로 8바이트 단위로 읽어들이지 않으면 값이 손상됨

2) 데이터 타입에 의한 값의 해석

  • 메모리에서 읽어들인 2진수를 어떻게 해석할까
  • 데이터 타입에 따라 메모리에 저장된 값은 다르게 해석될 수 있음

 

⇒ 데이터 타입이 필요한 이유

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

 

10. 동적 타이핑

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

JS의 모든 값은 데이터 타입을 갖는다. 그런데 변수는?

  • C/ JAVA와 같은 정적 타입 언어는 변수의 타입을 변경할 수 없으며, 변수에 선언한 타입맞는 값만 할당 할 수 있음
  • 정적 타입 언어는 컴파일 시점에 타입체크(선언한 데이터 타입에 맞는 값을 할당했는지 검사하는 처리)를 수행함
  • 만약, 타입 체크를 통과하지 못했다면 에러를 발생시키고 프로그램의 실행 자체를 막음 → 이를 통해 타입의 일관성을 강제함으로써 더욱 안정적인 코드 구현으로 런타임에 발생하는 에러를 줄임

 

JS(동적 타입 언어)는 정적 타입 언어와 다르게

변수 선언시, 타입을 선언하지 않음
  • 단, var, let, const 키워드를 통해 변수를 선언
  • JS의 변수는 정적 타입 언어와 같이 미리 선언한 데이터 타입의 값만 할당할 수 있는 것이 아님 → 어떤 데이터 타입의 값이라도 자유롭게 할당 가능
  • typeof연산자로 변수를 연산하면 변수의 데이터 타입을 반환
  • 이는 변수의 데이터 타입을 반환 하는 것이 아니라, 변수에 할당된 값의 데이터 타입을 반환한 것
  • JS는 값을 할당하는 시점변수의 타입이 동적으로 결정되고 변수의 타입을 자유롭게 언제든지 바꿀 수 있음

⇒ JS의 변수는 선언이 아닌

할당

에 의해

타입이 결정

(타입추론)됨

⇒ 그리고 재할당에 의해

변수의 타입

은 언제든지 동적으로

변할 수 있음

: 동적 타이핑

 

2) 동적 타입 언어와 변수

  • 동적 타입 언어는 변수에 어떤 데이터 타입의 값이라도 자유롭게 할당 가능
  • 하지만, 변수 값이 언제든 변할수 있기 때문에 복잡한 프로그램에서는 변수값을 추적하기 어려울 수 있음

⇒ 동적 타입 언어는 유연성은 높지만, 신뢰성은 떨어짐

 

[변수 사용시 주의사항]

  • 변수는 꼭 필요한 경우에 한해 제한적으로 사용하기
  • 변수의 유효 범위(스코프)는 최대한 좁게 만들어 변수의 부작용 억제하기
  • 전역변수최대한 사용하지 않도록 하기
  • 변수보다 상수를 사용해 값의 변경을 억제하기
  • 변수이름은 변수의 목적/의미를 파악할 수 있도록 네이밍하기

 

728x90