관리 메뉴

흰둥씨의 개발장

[자바스크립트] 딥다이브) 데이터타입 본문

BoOk/JS deep dive

[자바스크립트] 딥다이브) 데이터타입

돈워리비해삐 2023. 4. 20. 01:20

데이터 타입 ( = data type = 타입) ? 값의 종류

ㄴ7개로 분류되며 원시타입과 객체타입으로 나눌 수 있음

원시 타입
(primitive type)
number (숫자 타입)  숫자, 정수와 실수 구분없이 하나의 숫자타입만 존재 
string (문자열 타입) 문자열
boolean true / false
undefined var키워드로 선언된 변수에 암묵적으로 할당되는 값 
null  값이 없다는 것을 의도적으로 명시할 때 사용하는 값
symbol ES6 에서 추가됨 / 
객체 타입(object/ reference type) 객체, 함수, 배열 ... 

 

1) 숫자 타입 

ㄴ자바스크립트는 하나의 숫자 타입만 존재함 (C 나 Java는 정수, 실수 구분해서 int, long, float, double과 같은 다양한 숫자타입 존재)

ㄴ숫자타입은 배정밀도 64비트 부동소수점 형식을 따름 

ㄴ모든 수를 실수로 처리 , 정수만 표현하기 위한 데이터 타입이 별도로 없음 (정수로 표시 해도 사실상 실수임)

ㄴ정수, 실수, 2진수, 8진수, 16진수를 표현하기 위한 데이터 타입을 제공하지 않아서 모두 10진수로 해석됨 

ㄴInfinity (양의무한대) , -Infinity(음의무한대), NaN(산술 연산 불가 not a number) 표현가능 

ㄴ대소문자를 구분하기 때문에 꼭 NaN으로 표기해야함 (NAN, nan != NaN)

let integer = 10;  //정수
let double = 10.1; //실수
let negative -20;  //음의 정수

let binary = 0b01000001; //2진수 => 65
let octal = 0o101;      //8진수  => 65
let hex = 0x41;         //16진수 => 65

1 === 1.0 //true
10 / 0   //Infinity
10 / -0. //-Infinity
1 * 'String'  // NaN

 

2) 문자열 타입 

ㄴ텍스트 데이터 나타냄

ㄴ0개 이상 16비트 유니코드문자(UTF-16)집합

ㄴ작은따옴표, 큰따옴표, 백틱으로 텍스트 감싸서 표현 

ㄴ따옴표로 감싸지 않으면 키워드나 식별자와 같은 토큰으로 인식함 

ㄴ원시타입으로 변경불가능한 값 (immutable value) 

 

 

3) 템플릿 리터럴 

ㄴ멀티라인 문자열(multi-line string), 표현식삽입(expression interpolation), 테그드 템플릿(tagged template)등

ㄴ편리한 문자열 처리 기능 제공

ㄴ런타임에 일반 문자열로 변환되어 처리됨(표현식의 평가 결과가 문자열아니어도 문자열로 타입이 강제 변환되어 삽입됨)

ㄴ백틱만을 사용하는 것 !

 

- 3.1) 멀티라인 문자열
ㄴ일반 문자열내에서는 줄바꿈안됨(줄바꿈 공백사용하려면 백슬레시(\)로 시작하는 이스케이프 시퀀스 써야함 )

ㄴ백틱 안에 쓰면 줄바꿈 한 것도 출력에 적용됨

let normal = '<ul>\n\t<li><a href= "#">Home</a></li>\n</ul>'  // 이스케이프 시퀀스

let template = `<ul>
	<li><a href= "#">Home</a></li>
</ul>`                                 //멀티라인 문자열 

//console.log로 normal과 template 출력하면 결과는 둘다 아래와같이 표시됨 

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

 

 

- 3.2) 표현식 삽입 

 ㄴ일반적으로 문자열은 문자열 연산자  + 사용해 연결할수 있다. 

let first = 'Zzanggu';
let last = 'Shin';

//Es5 : 문자열 연결
console.log('My name is' +first + " " + last + ".");// My name is Zzanggu Shin.

그러나 템플릿 리터럴 내에서는 ${}안에 표현식 넣을수 있다. 

let first = 'Zzanggu';
let last = 'Shin';

//Ex6 : 표현식 삽입
console.log(`My name is ${first} ${last}.`);// My name is Zzanggu Shin.

 

 

4) Boolean

ㄴtrue / false

 

5) undefined

ㄴvar키워드 변수는 암묵적으로 undefined로 초기화 됨, 값이 할당된적이 없는 변수가 갖고있는 값 

ㄴ개발자가 의도적으로 할당하기 위한 값이 아닌 자바스크립트 엔진이 변수를 초기화 할때 사용하는 값 

ㄴ변수에 값이 없다는 것을 명시 하기 위해서는 해당값을 쓰면 안된다. 

 

 **C언어에서는 변수를 선언했을 때는 컴파일러에게 식별자의 존재만을 알리는것이고, 컴파일러가 변수를 생성해서 식별자와 메모리 주소가 연결되면 정의로 구분한다. 하지만 자바스크립트는 변수 선언하면 바로 정의까지 이뤄지기때문에 ECMA script에서는 변수는 '선언한다', 함수는 '정의한다'라고 표현한다. 

 

6) null

ㄴNull, NULL은 null과 다르다 

ㄴ변수에 값이 없다는 것을 의도적으로 명시 할때 사용함(intentional absence)

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

= 이전 할당 값에 대한 참조를 명시적으로 제거 하는 것 의미 

ㄴ함수가 유효한 값을 반환할 수 없는 경우 null 반환하기도 함 

 

7) symbol

ㄴ변경 불가능한 원시타입의 값

ㄴ다른 값과 중복되지 않는 유일무이한 값

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

ㄴSymbol함수를 호출해서 생성함 

ㄴ생성된 심벌값은 외부에 노출되지 않음 

 

let key = Symbol('key');
console.log(typeof key);  //symbol

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

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

 

 

8) 객체 타입

ㄴ자바스크립트는 객체 기반의 언어 

ㄴ자바스크립트를 이루고있는 거의 모든것이 객체이다. 

ㄴ문자열, 숫자,  boolean, undefined, null, symbol이외의 값은 모두 객체 타입임

 

 

9) 데이터 타입의 필요성

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

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

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

 

 

10) 동적 타이핑 

정적 타입 언어 

ㄴC, C++, JAVA, Kotlin, Go, Haskell, Rust, Scala... 

ㄴ변수 에 할당 할수 있는 값의 종류 , 데이터 타입을 사전에 선언해야 한다 =명시적 타입선언 (explicit type declaration)

ㄴ변수타입을 변경할수 없고, 타입에 맞는 값만을 할당할 수 있음

ㄴ컴파일 시점에 타입체크함 => 타입의 일관성을 강제해서 런타임에 발생하는 에러를 줄임  

//변수 c에는 1바이트 정수 타입의 값만을 할당할 수 있다. 
char c; 

//변수num에는 4바이트 정수 타입 값만 할당할 수 있다. 
int num;

 

동적 타입 언어

ㄴJavascript, Python, PHP, Ruby, Lisp, Perl...

ㄴ변수에 어떤 데이터타입이라도 자유롭게 할당할수 있음 

ㄴ할당에 의해 타입이 결정됨 (타입추론 type inference)

ㄴ재할당에 의해 변수 타입은 언제든지 동적으로 변할수 있음 = 동적타이핑(dynamic typing) 

ㄴ편리하긴하지만 위험함 (유연하지만 신뢰도는 떨어짐)

   - 복잡한 프로그램에서는 변화하는 변수 값을 추적하기 어려울수 있음 => 값을 확인하기 전에는 타입 또한 확신할수 없음 

   - 암묵적으로 타입이 자동 변환되기도 해서 오류나기도 함 

 

**변수 사용시 주의사항

1) 변수는 꼭필요한 경우에만 제한적으로 쓰기 (변수개수가 많을수록 오류 확률 높아짐)

2) 변수의 스코프(유효범위)는 최대한 좁게 만들어 부작용 억제 해야함 

3) 전역변수는 안쓰는게 최고

4) 변수보다는 상수 사용하는 것이 좋음 (값변경 억제)

5) 변수의 이름은 목적, 의미를 잘 파악할수 있도록 짓기 => 사람이 이해하기 좋은 코드가 최고