TIR: 완벽가이드 1. 코어자바스크립트(2) 타입, 값, 변수 - 220613

Lumpen·2022년 6월 13일
0

TIR

목록 보기
3/40

타입, 값, 변수

컴퓨터 프로그램은 숫자나 문자열 같은 값을 다룬다
프로그래밍 언어로 다룰 수 있는 값의 유형을 데이터 타입이라고 한다
이것은 프로그래밍 언어의 가장 기본적 특징이 된다

프로그램은 값이 유지될 필요가 있을 때 변수에 값을 할당(저장)한다

자바스크립트의 타입은 크게 원시 타입, 객체 타입으로 나뉘고
원시 타입으로는 숫자, 문자열, 불리언이 있다
null과 undefined는 원시 값이지만 각자 자신만을 값으로 갖는 독립적인 타입이다

객체

원시 값 이외의 값은 모두 객체다
객체는 이름과 값을 갖는 프로퍼티의 집합이다
객체의 값에는 원시값과 객체 모두 들어갈 수 있다
이름은 문자열 형식만 가능하다
자바스크립트의 객체는 순서가 없는 값들의 집합이다

배열

배열은 특별히 순서가 있는 값들의 집합이며 각 값에는 이름이 아닌 index(번호)가 부여된다
배열은 typeof 배열 === 'object'와 Array.isArray(배열) 모두 true
배열은 일반 객체와는 조금 다르다

함수

자바스크립트는 함수도 객체이다
함수는 특별한 객체로 실행 코드를 가지고 있는 개체로, 호출하면 내부에 정의된 코드가 수행된다
배열과 마찬가지로 함수는 일반 객체와 다르게 동작한다
자바스크립트는 함수를 실행하는 특별한 문법을 가지고 있다
가장 중요한 것은 함수는 값이고, 자바스크립트 프로그램은 함수를 보통 객체처럼 다룰 수 있다

클래스

함수 중에는 new 연산자를 이용하여 새로 생선된 객체를 초기화하는 용도로 사용되는 함수가 있는데
이를 생성자(constructor) 함수라고 한다
생성자는 객체들의 클래스를 정의한다
여기서의 객체는 생성자로 초기화되는 대상을 말한다
클래스는 객체 타입의 하위 타입으로 생각할 수 있다

코어 자바스크립트에서는 Array, Function, Date, RegExp 등의 클래스가 정의되어 있고
자신만의 클래스를 정의할 수도 있다

가비지 컬렉션

자바스크립트 인터프리터는 메모리 관리를 위해 자동으로 가비지 컬렉션을 수행한다
객체에 더이상 접근하지 않을 때 (프로그램이 더 이상 참조하지 않을 때) 자동으로 메모리에서 해제

자바스크립트는 객체 지향 언어다
넓은 의미에서, 다양한 타입의 값을 다루는 전역 함수를 정의하기보다,
어떤 값과 작동하는 메서드를 그 값의 타입에 정의해둔다는 말이다

// 배열 정렬 시 sort() 함수에 인자로 배열을 전달하는 것이 아니라 a의 sort() 메소드를 호출한다
a.sort();

자바스크립트의 타입은 원시, 객체 뿐만 아니라 메소드를 가진 타입, 아닌 타입으로,
수정가능한 타입, 수정 할 수 없는 타입으로도 나눌 수 있다
객체와 배열은 수정 가능한 타입이지만 숫자나 boolean, null, undefined 등은 수정할 수 없다

자바스크립트에서는 문자열 또한 수정할 수 없는 타입이다
문자열을 수정하는 어떤 방법도 제공하지 않는다

자바스크립트의 값은 타입 변환이 자유롭다
자바스크립트의 자유로운 값 변환은 동일성 정의에도 영향을 미친다

자바스크립트 변수들은 타입이 정해져 있지 않기 때문에 어떠한 값도 할당할 수 있고
같은 변수에 다음번에는 다른 타입을 할당할 수도 있다

자바스크립트는 어휘 유효범위(scope)를 사용한다
함수 밖에서 선언된 변수들은 전역 변수로 어디서든 사용 가능하다
함수 안에 선언된 변수들은 유효 범위가 함수 영역이다

숫자

다른 프로그래밍 언어들과 달리 자바스크립트는 정수와 실수 값을 구분하지 않는다
-> 모든 값을 실수로 표현
IEEE 754 표준에서 정의한 64비트 부동 소수점 실수 형태로 표현한다

배열 인덱싱이나 비트 연산과 같은 특정 연산은 32비트 정수로 수행한다
프로그램 안에서 그대로 나타나는 숫자를 숫자 리터럴이라고 한다

정수 리터럴

자바스크립트에서 10진수 정수는 숫자를 일렬로 나열한 것

자바스크립트는 16진수 리터럴도 제공
ECMAScript 표준에서는 8진수 표현을 지원하지 않는다
구현체에 따라 8진수 리터럴을 지원할 수도 있고 하지 않을 수도 있다
때문에 0으로 시작하는 정수 리터럴은 절대 사용하지 않는다
0으로 시작하면 8진수인지 10진수인지 판단하기 힘들다
ES5 Strict 모드에서는 8진수 리터럴을 명시적으로 금지한다

부동 소수점 리터럴

실수를 표현하는 전통적 문법을 따른다
실수는 정수 부분과 소수점, 소수점 이하로 표현한다
부동소수점 리터럴은 지수 표기법으로도 표현할 수 있다.
실수에 이어 문자 e(E) 가 따라나오고, 뒤에 선택저으로 덧셈 or 뺄셈 기호, 정수 지수 값이 따라온다
1.44214E-32
10^32

산술 연산

자바스크립트는 산술연산자를 사용하여 숫자를 다룬다

      • / % 의 기본 산술 연산
        뿐만 아니라 Math 객체를 통해 더 복잡한 수치 연산을 지원한다
        자바스크립트의 산술 연산은 overflow, underflow, 0으로 나누는 에러를 발생시키지 않는다
        산술 연산의 결과가 표현할 수 있는 가장 큰 수 보다 크다면 (overflow의 경우) Infinity라고 표현하는 무한대의 값을 출력한다 음수는 -Infinity

언더플로는 산술연산의 결과가 표현할 수 있는 가장 작은 값 보다 작을 때 발생하지만
자바스크립트는 이 경우 0을 반환한다
언더플로가 음수에서 발생할 경우 특수 값인 '음의 0'을 반환한다
예외로 0을 0으로 나누는 값 등의 정의되지 않은 값을 NaN으로 출력한다


자바스크립트는 Infinity, NaN 등을 표현하기 위해
전역변수로 미리 정의되어 있다
ES3에서는 읽고 쓰기가 가능한 값이지만
ES5에서는 읽기 전용 값으로 정의한다

Number 객체에서는 버전에 관계 없이 읽기 전용이다

NaN

NaN은 비교할 수 있는 값이 아니다
isNaN() 함수로 비교 가능
isFinite() 함수는 Infinity, NaN 비교 가능
0과 -0은 거의 같다

1/0 === 1/-0 // false - 음의 무한대와 양의 무한대는 다르다

이진 부동소수점과 반올림 오류

한정된 숫자만 부동 소수점으로 표현 가능
실수 연산을 할 때는 근사 값으로 표현한다
현대적 프로그래밍 언어에서 사용하는 IEEE-754 부동 소수점 표현 방식은

1/2 1/8 1/1024...

와 같이 2의 배수를 분모로 갖는 분수를 정확히 표현할 수 있는 이진 표현법이다

하지만 가장 많이 사용되는 분수는 10진수 분수인데

1/10 1/100...

이진 표현법으로는 0.1과 같은 간단한 값도 정확하게 표현할 수 없다

자바스크립트의 숫자는 높은 정밀도를 가지고 있어 근접한 근사치를 내지만, 정확하게 표현할 순 없다

const x = 0.3 - 0.2
const y = 0.2 - 0.1
x == y // false
x == 0.1 // false
y == 0.1 // true

이 것은 자바스크립트의 결함이 아니라 이진 부동소수점 숫자를 사용하기 때문이다
계산된 값은 대부분 적절하지만 동등 비교 시 문제가 발생한다
-> BigNumber.js 사용

profile
떠돌이 생활을 하는. 실업자는 아니지만, 부랑 생활을 하는

0개의 댓글