데브코스 Node.js 강의를 듣던 중 강사님이 JS에서는 문자열도 객체라는 말씀을 하셨습니다.
JS에서 문자열은 원시 데이터 타입인걸로 알고있었는데 좀 혼란스럽더라구요.
그래서 문자열이 객체인지 궁금해져서 이것저것 좀 찾아본 결과를 정리했습니다.
JavaScript에서 데이터 타입은 크게 원시 데이터 타입과 객체 데이터 타입의 두가지로 나뉩니다.
"Hello, World!"
42
, 3.14
9007199254740991n
true
와 false
를 나타냅니다.{ name: "Alice", age: 30 }
[1, 2, 3]
그런데 우리는 JavaScript에서 원시 데이터 타입인 문자열에 대해 .length
나 .toUpperCase()
와 같은 프로퍼티와 메소드를 사용할 수 있습니다.
이는 마치 원시 데이터 타입이 객체처럼 동작하는 것처럼 보이게 합니다.
let myString = "hello";
console.log(myString.toUpperCase()); // "HELLO"
이렇게 원시 데이터 타입을 객체처럼 사용할 수 있는 이유는 JavaScript 엔진이 자동으로 원시 값을 해당하는 래퍼 객체로 임시 변환하기 때문입니다.
다른 원시 데이터 타입인 Number
, Boolean
, BigInt
, Symbol
등도 사용자가 프로퍼티나 메소드를 사용할 때 동일한 과정을 거칩니다.
원시 값에 대해 객체처럼 메서드를 호출하거나 속성에 접근하려고 할 때, 자바스크립트 엔진은 자동으로 해당 원시 값을 래퍼 객체로 변환합니다.
예를 들어, 문자열 원시 타입에 대한 래퍼 객체는 String
객체입니다.
다른 원시 데이터 타입도 각각 Number
, Boolean
, BigInt
, Symbol
등의 래퍼 객체를 가집니다.
원시 데이터 타입을 객체처럼 사용할 때 임시적으로 사용된 래퍼 객체는 재사용 되지 않으며, 사용 후 가비지 컬렉터에 의해 자동으로 메모리에서 제거됩니다.
결론적으로, JavaScript에서 문자열은 기본적으로 원시 데이터 타입이며, 객체가 아닙니다.
그러나 JavaScript의 유연성 덕분에, 이 원시 타입은 필요한 경우 객체처럼 다루어질 수 있습니다.
이는 내부적으로 JavaScript 엔진에 의해 래퍼 객체를 통해 이루어지는 일시적인 변환이며, 실제로 문자열이 객체 데이터 타입으로 변하는 것은 아닙니다.
따라서 JS에서 문자열(String)은 본질적으로 객체가 아니라 원시 데이터 타입이라는 것을 알 수 있었습니다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Data_structures
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String#string_coercion
https://developer-talk.tistory.com/69