모던 자바스크립트 (Modern JavaScript)
현 시점에서 사용하기 적합한 범위 내에서 최신 버전의 표준을 준수하는 자바스크립트
자바스크립트는 다른 프로그래밍 언어에 비해서 데이터 타입이 상대적으로 유연한 특징이 있다.
여기서 유연하다는 말은 상황에 따라서 데이터 타입이 변할 수도 있다는 의미를 가지는데,
파이썬 같은 경우에는 일반적으로 서로 다른 데이터 타입끼리는 연산을 할 수가 없으며 (ex: 2+"3" → 숫자 + 문자열)
데이터 타입의 구분이 엄격한 C나 Java 같은 경우에는 변수에도 따로 타입을 정해줘야 하기 때문에
한번 타입이 정해진 변수에는 해당 타입의 값만 할당할 수 있다.
하지만 자바스크립트에서 숫자2와 문자열"3"을 더하면 숫자2가 문자열"2"로 되어 문자열"23"이 되고
숫자2와 문자열"3"을 곱하면 숫자 3으로 되어 결과값 숫자 6이 되기도 한다.
그리고 변수에도 따로 타입을 정해 주지 않기 때문에 언제든지 다양한 타입의 값으로 재할당이 가능하다.
허나 이런 현상을 극단적으로 "자바스크립트에는 데이터 타입이 없다" 라는 비판의 목소리도 존재한다.
하지만 자바스크립트의 값에는 엄연히 데이터 타입이 존재하기 때문에
자바스크립트를 좀 더 능숙하게 다루기 위해서는 데이터 타입을 좀 더 명확하게 이해하는게 중요하다.
결과적으로 내가 작성한 코드가 어떤 타입의 값을 리턴하는지 확실하게 알고있어야
예상치 못한 결과로 프로그램이 오류가 나는 상황을 피할 수 있다.
자바스크립트의 데이터 타입은 총 8가지가 존재한다.
기본형(Primitive Type)과 참조형(Reference Type)로 나누어진
Number,String,Boolean,Null, undefined, Object와
ES2015에서 새롭게 추가된 Symbol과 ES2020에서 추가된 BigInt라는 타입이 있다.
- Symbol - 다른 것과 중복되지 않는 유일한 값을 만들어 낼 때 사용하는 타입
- BigInt - 엄청 큰 수를 다룰 때 사용하는 타입
이 두 가지는 새롭게 추가된 타입인 만큼 아직은 두 타입의 활용 사례가 많지 않고
일반적인 상황보다는 조금 특별한 상황에서 필요한 타입이기 때문에
자주보게 될 타입은 저 두 타입을 제외한 나머지 타입이라고 할 수 있다.
■ 자료형 복습하기 - link
한번 Symbol과 BigInt를 간단하게 살펴보자
Symbol
심볼(symbol)은 기본형 데이터 타입(primitive data type) 중 하나이며
코드 내에서 유일한 값을 가진 변수 이름을 만들 때 사용한다.
const user = Symbol('My Name is SeopE');
user === 'My Name is SeopE'; // false
user === 'SeopE'; // false
user === 'Symbol'; // false
user === true; // false
user === false; // false
user === 123; // false
user === 0; // false
user === null; // false
user === undefined; // false
이렇게 Symbol 함수를 통해서 심볼 값을 만들어 낼 수 있고
괄호안에 심볼에 대한 설명을 붙여 Symbol 값을 담게된 user이라는 변수는
다른 어떤 값과 비교해도 true가 될 수 없는 고유한 변수가 된다.
또한 똑같은 설명을 붙인 심볼을 만들어도 두 값을 비교하면 false가 반환 된다.
const symbolA = Symbol('My Name is SeopE');
const symbolB = Symbol('My Name is SeopE');
console.log(symbolA === symbolB); // false
BigInt
BigInt는 자바스크립트에서 아주 큰 정수(Integer)를 표현하기 위해 등장한 데이터 타입이다.
자바스크립트의 숫자에는 안전한 정수 표현의 한계가 있는데
자바스크립트에서 안전한 최대 정수는 2**53 - 1, 안전한 최소 정수는 -(2**53 - 1) 이다.
2**53 - 1은 구체적으로 9007199254740991이라는 숫자로 약 9,000조 정도의 숫자이며
안전한 정수 표현이라는 의미는 자바스크립트에서 이 숫자 범위를 초과하는 정숫값을 사용하려고 하면
연산에 미세한 오류가 발생한다는 의미이다
예를 들면, 9007199254740991 + 1과 9007199254740991 + 2를 비교하면 true라는 결과가 리턴되는데
실제로 콘솔에 9007199254740991 + 2과 심지어 9007199254740993을 출력해봐도
9007199254740993이 아니라 9007199254740992가 출력되는 모습을 확인할 수 있는데
이러한 숫자 범위는 배정밀도 부동소수점 형식 숫자체계를 사용하기 때문이며
굳이 저런 형식을 이해하려하기보단
그냥 자바스크립트 숫자형값에는 9000조 정도의 정수 표현의 한계가 존재한다. 라고 보면 된다.
console.log(9007199254740991 + 1 === 9007199254740991 + 2); // true
console.log(9007199254740991 + 2); /// 9007199254740992
console.log(9007199254740993); /// 9007199254740992
사실 9000조라는 숫자는 꽤 큰 숫자라서 대부분 활용되진 않지만
암호관련 작업이나 계산기 관련 작업할 때 큰 숫자를 다룰때나 정확한 연산이 필요한 경우,
그럴 때 BigInt 데이터 타입의 값을 사용하면 된다.
BigInt 타입의 값은 일반 정수 마지막에 알파벳 n을 붙이거나 BigInt 함수를 사용한다.
console.log(9007199254740993n); // 9007199254740993n
console.log(BigInt('9007199254740993')); // 9007199254740993n
이렇게 하면 큰 정숫값도 안전하게 표현할 수 있다.
※ 참고로 BigInt의 생성자에 문자열로 값을 넘겨준 이유는
큰 정수를 그대로 사용하면 안전한 최대 정수로 처리하기 때문이다.
또한 BigInt 타입은 큰 정수를 표현하기 때문에 소수 표현에는 사용할 수 없다.
1.5n; // SyntaxError
10n / 6n; // 1n
5n / 2n; // 2n
3n * 2; // TypeError
3n * 2n; // 6n
Number(3n) * 2; // 6
그래서 소수 형태의 결과가 리턴되는 연산은 소수점 아랫 부분은 버려지고 정수 형태로 리턴되고
BigInt 타입끼리만 연산할 수 있으며 서로 다른 타입끼리의 연산은 명시적으로 타입 변환을 해야한다.
이렇게 큰 범위의 정수를 안전하게 사용할 수 있다는 장점이 존재하지만
실제로 BigInt 타입의 값을 다룰 상황이 많지는 않을 것이다. 나중에 활용할 수 있을 날이 오려나..?
'JS' 카테고리의 다른 글
(3) Modern JavaScript - Boolean Type Conversion (0) | 2024.11.21 |
---|---|
(2) Modern JavaScript - Typeof 연산자 (복습) (0) | 2024.11.20 |
(22) Interactive JavaScript (Event) - 스크롤 이벤트 (0) | 2024.11.18 |
(21) Interactive JavaScript (Event) - input 태그 (0) | 2024.11.15 |
(20) Interactive JavaScript (Event) - 키보드 이벤트 (0) | 2024.11.14 |