❓빌트인 객체란
일단 빌트인(built in)의 사전적 정의는 "내장"이다. 그렇다면 빌트인 객체는 내장되어 있는 객체라고 이해할 수 있을텐데, 실제로 빌트인 객체는 자바스크립트에서 기본적으로 제공하는 객체를 의미한다. 그렇다면 빌트인 객체의 종류로는 어떤 것들이 존재할까? 그 이전에 자바스크립트에서의 객체 구분에 대해서 알아보자.
1️⃣ 표준 빌트인 객체: 위에서 설명한 자바스크립트에서 기본적으로 제공하는 객체로 ECMAScript 사양에 정의되어 있는 객체이기 때문에 자바스크립트의 실행환경 즉, 브라우저든 node.js든 상관없이 언제나 사용이 가능하다. 표준 빌트인 객체는 전역 객체의 프로퍼티로 제공된다.
2️⃣ 호스트 객체: 표준 빌트인 객체가 실행환경에 상관없이 제공되는 객체라면 호스트 객체는 자바스크립트 실행환경에 따라 추가적으로 제공되는 객체를 의미한다. 브라우저 환경이라면 DOM, BOM, Canvas,XMLHttpRequest, fetch 등의 Web API가 호스트 객체이고, node 환경이라면 node.js 고유의 API를 호스트 객체로 제공한다.
3️⃣ 사용자 정의 객체: 사용자가 직접 정의한 객체를 의미한다.
빌트인 객체의 종류로는 Object, String, Number, Boolean, Symbol, Date, Math, RegExp, Array, Map, Set, Function, Promise 등의 약 40여 개가 존재한다. 해당 빌트인 객체의 종류 중 Math, Reflect, JSON을 제외한 모든 빌트인 객체는 생성자 함수 객체이기 때문에 인스턴스를 생성하는 것이 가능하다.
const str = new String("hi") // String {"hi"}
위의 코드는 String 생성자 함수를 통해 인스턴스를 생성한 것이다. 해당 인스턴스를 출력해보면 String.prototype을 프로토타입으로 가지고 있는 것을 알 수 있다.
그림을 보면 알 수 있듯이 표준 빌트인 String 객체의 prototype 프로퍼티에 바인딩된 객체 즉, String.prototype은 다양한 프로토타입 메서드를 제공한다. 아까 언급했던 것처럼 인스턴스를 만들 수 있는 생성자 함수인 빌트인 객체는 인스턴스가 해당 빌트인 객체의 프로토타입 메서드를 사용하는 것이 가능하다. (왜 사용할 수 있는지 모르겠다면 지난 포스팅을 확인하길 바란다.)
String 빌트인 객체 말고 Number 빌트인 객체를 통해 하나 더 예시를 들어보겠다.
const num = new Number(10) // Number {10}
num.toString() // '10'
표준 빌트인 객체인 Number를 통해 생성한 인스턴스인 num 객체의 프로토타입은 Number 생성자 함수의 prototype 프로퍼티에 바인딩된 Number.prototype이다. 따라서 프로토타입 체인을 통해 상속받을 수 있고, Number.prototype의 메서드를 사용하는 것이 가능하다.
추가적으로 인스턴스를 생성하지 않고도 사용할 수 있는 생성자 함수의 메서드를 정적 메서드라고 하는데, Number 빌트인 객체는 정적 메서드 또한 제공한다.
래퍼 객체
const str = "hi";
console.log(str.split('')); // ['h', 'i']
console.log(typeof str); // string
빌트인 객체에 대해서 이해하고, 위의 코드를 보자. 나도 빌트인 객체를 공부하고 의문이 들었던 점이다. 원시값과 객체는 다른 특징을 가진다고 배웠고, 빌트인 객체를 통해 인스턴스를 생성하지도 않았는데 어떻게 String 생성자 함수의 prototype 프로퍼티에 바인딩된 객체인 String.prototype의 메서드들을 사용할 수 있는 것일까?
여기서 래퍼 객체라는 개념이 등장하는데, 이는 원시값에 객체처럼 마침표 표기법 또는 대괄호 표기법으로 접근하게되면 자바스크립트 엔진이 일시적으로 해당 원시값과 연관된 객체를 생성한다. 이 생성된 객체를 래퍼 객체라고 한다.
위의 코드로 설명하면, 원시타입인 문자열에 마침표 표기법으로 접근하면 자바스크립트 엔진이 일시적으로 래퍼 객체인 String 생성자 함수의 인스턴스를 생성하고, 해당 문자열은 생성된 래퍼 객체의 [[StringData]] 내부 슬롯에 할당된다. 이 때 문자열 래퍼 객체인 String 생성자 함수의 인스턴스는 String.prototype의 메서드를 상속받아서 사용하는 것이 가능하다. 이 후 래퍼 객체의 [[StringData]] 내부 슬롯에 할당되어 있던 원시값으로 돌아가고 래퍼 객체는 가비지 컬렉션의 대상이 된다.
위와 같이 래퍼 객체의 개념을 통해 원시 값인 문자열, 숫자, 불리언 등이 표준 빌트인 객체의 프로토타입 메서드를 사용할 수 있기 때문에, String, Number, Boolean 생성자 함수를 통해 인스턴스를 생성하여 사용할 필요도 없고 권장되지도 않는다.
전역 객체
전역 객체는 어떤 객체에도 속하지 않는 최상위 객체이고, 자바스크립트 실행 환경에 따라 이름이 다르다. 일반적으로 브라우저 환경에서는 전역객체의 이름이 window이지만, node 환경에서는 global이라는 이름을 가진다.
표준 빌트인 객체 또한 전역 객체의 프로퍼티이고, 전역 객체는 이외에도 호스트 객체, var로 키워드로 선언한 전역 변수와 전역 함수를 프로퍼티로 갖는다.
이 때 전역 객체의 프로퍼티 참조에서는 전역 객체의 이름을 생략하는 것이 가능하다. 주로 사용되는 전역 객체의 프로퍼티는 isFinite, isNaN, parseFloat, parseInt 등이 존재한다.