6장 데이터 타입

inhalin·2021년 3월 16일
0
post-thumbnail

자바스크립트의 데이터타입에는 원시타입 7가지(number, string, boolean, undefined, null, symbol)와 객체타입이 있다.

6.1 숫자 타입

'숫자 타입의 값은 배정밀도 64비트 부동소수점 형식을 따른다.'
=> 모든 수를 실수로 처리한다.
=> 2진수, 8진수, 16진수 리터럴 모두 10진수로 해석된다.

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

console.log(binary);    // 65
console.log(octal);     // 65
console.log(hex);       // 65

추가적으로 Infinity, -Infinity, NaN(Not-a-Number) 세 가지의 특별한 값을 표현할 수 있다.

console.log(1 / 0);     // Infinity
console.log(-1 / 0);    // -Infinity
console.log(5 * 'hello'); // NaN

6.2 문자열 타입

UTF-16의 집합으로 대부분의 문자를 표현할 수 있다.

자바스크립트의 문자열은 원시타입이고 변경 불가능한 값(immutable value)이다.

str = '작은따옴표 안에 "큰따옴표" 사용가능';
str2 = "큰따옴표 안에 '작은따옴표' 사용가능";	//
str3 = `백틱을 사용한 문자열의 기능은 밑에서 계속...`;	// ES6

6.3 템플릿 리터럴(template literal)

템플릿 리터럴은 멀티라인 문자열, 표현식 삽입, 태그드 템플릿 등 문자열 처리 기능 제공하고 백틱을 사용해 표현한다.

  1. 멀티라인 문자열

일반 문제열에서 개행이나 따옴표 등을 표현하려면 이스케이프 시퀀스를 사용해야 하지만 템플릿 리터럴에서는 이스케이프 시퀀스를 사용하지 않고도 줄바꿈이나 공백 등이 모두 적용된다.

var old_str = '<ul>\n\t<li>일반 문자열<li>\n</ul>';

var template_literal = `<ul>
	<li>템플릿 리터럴</li>
</ul>`;
이스케이프 시퀀스의미
\0Null
\b백스페이스
\f폼 피드(Form Feed)
\n개행(Line Feed)
\r개행(Carriage Return)
\t탭(수평)
\v탭(수직)
\uXXXX유니코드
\'작은따옴표
\"큰따옴표
\백슬래시

라인피드(Line Feed)와 캐리지리턴(Carriage Return)

개행문자는 과거 타자기에서 커서를 제어하는 방식에서 온 것으로 LF는 커서를 현재 위치에서 그대로 한줄 내리는 것이고 CR은 커서를 맨 앞으로 보내는 것이다.
현재는 운영체제별로 개행방식이 다르다. 윈도우는 CR+LF, 유닉스는 LF, macOS(버전 10 이후)는 LF를 사용한다. 대부분의 텍스트 에디터는 운영체제에 맞게 개행문자를 자동 변환해준다. 자바스크립트에서는 일반적으로 LF로 개행한다.

  1. 표현식 삽입(expression interpolation)
var name = '홍길동';
var age = '18';

console.log(`반갑습니다! ${name}님의 ${age}번째 생일을 축하합니다!`);	
// 반갑습니다! 홍길동님의 18번째 생일을 축하합니다!

console.log(`3 + 16 = ${3 + 16}`);  // 3 + 6 = 19

6.4 불리언 타입

불리언 타입은 true, false 두가지 값만 있다.

6.5 undefined 타입

var 키워드로 변수를 선언하고 값을 할당하지 않으면 암묵적으로 undefined로 초기화된다.

선언(declaration)과 정의(definition)

C 같은 경우 선언과 정의의 구분이 엄격하다. 단순히 컴파일러에 식별자의 존재만 알리면 선언이고, 실제로 변수를 생성해 식별자와 메모리 주소가 연결되면 정의로 구분된다.

자바스크립트의 undefined는 '정의되지 않은' 상태인데 변수를 선언하면 암묵적으로 정의가 이뤄져서 선언과 정의의 구분이 모호하다. ESMAScript 사양에서 변수는 '선언'하고 함수는 '정의'한다.

6.6 null 타입

null은 값이 없다는 것을 의도적으로 명시할때 사용한다. 변수에 null을 할당하면 이전 참조값을 명시적으로 제거하는 것을 의미한다.

함수가 유효한 값을 반환할 수 없는 경우에도 명시적으로 null을 반환하기도 한다. 예를 들어 document.querySelector 메서드는 조건에 맞는 요소가 없으면 에러 대신 null을 반환한다.

6.7 심벌 타입

심벌(symbol)은 ES6에서 추가된 타입으로 변경 불가능한 원시타입 값이다.

Symbol 함소를 호출해 생성한 심벌값은 외부에 노출되지 않고 다른 값과 중복되지 않는 유일무이한 값이다.

6.8 객체 타입

자바스크립트의 데이터 타입은 크게 원시타입과 객체타입으로 분류된다. 위에서 나온 원시타입을 제외한 값은 모두 객체타입이다.

6.10 동적 타이핑

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

정적 타입(static/strong type) 언어는 변수를 선언할 때 데이터 타입을 사전에 선언해야 하고 변수의 타입을 변경할 수 없다. 컴파일 시점에 타입체크를 하고 통과하지 못하면 에러를 발생시키기 때문에 더 안정적인 코드를 구현할 수 있다.

대표적인 정적 타입 언어 : C, C++, Java, C#, Kotlin, Haskell, Rust, Scala 등

동적 타입(dynamic/weak type) 언어는 변수에 어떤 데이터타입 값이라도 자유롭게 할당할 수 있다. 변수의 선언이 아닌 할당에 의해 타입이 결정(타입 추론, type inference)되고 재할당에 의해 타입이 동적으로 변할 수 있다(동적 타이핑, dynamic typing).

대표적인 동적 타입 언어 : JavaScript, Python, PHP, Ruby, Lisp, Perl 등

  1. 동적 타입 언어와 변수

동적 타입 언어는 편리함과 유연성은 높지만 신뢰성은 떨어진다. 변수값과 타입이 언제든지 변할 수 있기 때문에 프로그램이 복잡해질수록 변수값을 추적하기 어려워진다. 따라서 안정적인 프로그램을 만들기 위해서는 변수를 사용할 때 주의해야 한다.

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

가독성이 좋은 코드가 좋은 코드다.


이웅모 저자의 <모던 자바스크립트 Deep Dive> 책으로 스터디 하면서 공부한 내용들을 요약 정리해서 올리는 글입니다. 더 자세한 내용이 궁금하신 분들은 책을 봐주세요.

0개의 댓글