JavaScript에서 문자열(String)은 객체(Object)인가?

Dukov·2024년 3월 28일
0

JavaScript

목록 보기
1/3
post-thumbnail

데브코스 Node.js 강의를 듣던 중 강사님이 JS에서는 문자열도 객체라는 말씀을 하셨습니다.

JS에서 문자열은 원시 데이터 타입인걸로 알고있었는데 좀 혼란스럽더라구요.

그래서 문자열이 객체인지 궁금해져서 이것저것 좀 찾아본 결과를 정리했습니다.


1. JS의 데이터 타입 종류

JavaScript에서 데이터 타입은 크게 원시 데이터 타입객체 데이터 타입의 두가지로 나뉩니다.

원시 데이터 타입(Primitive Data Types)

  • String: 텍스트 데이터를 표현하기 위한 타입입니다. 예: "Hello, World!"
  • Number: 숫자를 표현하는 타입으로, 정수와 실수 구분 없이 하나의 숫자 타입만 존재합니다. 예: 42, 3.14
  • BigInt: 매우 큰 정수를 표현하기 위한 타입입니다. 예: 9007199254740991n
  • Boolean: 논리적인 값인 truefalse를 나타냅니다.
  • Undefined: 값이 할당되지 않은 변수의 초기값입니다.
  • Null: '값이 없음'을 의도적으로 표현하기 위한 타입입니다.
  • Symbol: 고유하고 변경 불가능한 데이터 타입으로, 주로 객체 속성의 키로 사용됩니다.

객체 데이터 타입(Object Data Types)

  • Object: 키와 값의 집합체로, 다양한 데이터 타입을 포함할 수 있습니다. 예: { name: "Alice", age: 30 }
  • Array: 배열은 특별한 유형의 객체로, 순서가 있는 데이터의 집합을 다루기 위해 설계되었습니다. 예: [1, 2, 3]
  • Function: 함수는 일급 객체로, 기본적으로 다른 객체와 같은 방식으로 취급됩니다.

2. 우리가 원시 데이터 타입을 객체 데이터 타입처럼 사용 할 수 있는 이유

그런데 우리는 JavaScript에서 원시 데이터 타입인 문자열에 대해 .length.toUpperCase()와 같은 프로퍼티와 메소드를 사용할 수 있습니다.

이는 마치 원시 데이터 타입이 객체처럼 동작하는 것처럼 보이게 합니다.

let myString = "hello";
console.log(myString.toUpperCase()); // "HELLO"

이렇게 원시 데이터 타입을 객체처럼 사용할 수 있는 이유는 JavaScript 엔진이 자동으로 원시 값을 해당하는 래퍼 객체로 임시 변환하기 때문입니다.

다른 원시 데이터 타입인 Number, Boolean, BigInt, Symbol 등도 사용자가 프로퍼티나 메소드를 사용할 때 동일한 과정을 거칩니다.

3. 래퍼 객체 (Wrapper Object)

원시 값에 대해 객체처럼 메서드를 호출하거나 속성에 접근하려고 할 때, 자바스크립트 엔진은 자동으로 해당 원시 값을 래퍼 객체로 변환합니다.

예를 들어, 문자열 원시 타입에 대한 래퍼 객체는 String 객체입니다.

다른 원시 데이터 타입도 각각 Number, Boolean, BigInt, Symbol 등의 래퍼 객체를 가집니다.

원시 데이터 타입을 객체처럼 사용할 때 임시적으로 사용된 래퍼 객체는 재사용 되지 않으며, 사용 후 가비지 컬렉터에 의해 자동으로 메모리에서 제거됩니다.

4. 결론

결론적으로, JavaScript에서 문자열은 기본적으로 원시 데이터 타입이며, 객체가 아닙니다.

그러나 JavaScript의 유연성 덕분에, 이 원시 타입은 필요한 경우 객체처럼 다루어질 수 있습니다.

이는 내부적으로 JavaScript 엔진에 의해 래퍼 객체를 통해 이루어지는 일시적인 변환이며, 실제로 문자열이 객체 데이터 타입으로 변하는 것은 아닙니다.

따라서 JS에서 문자열(String)은 본질적으로 객체가 아니라 원시 데이터 타입이라는 것을 알 수 있었습니다.

5. References

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

profile
끊임없이 도전하고, 실패에서 배우는 백엔드 개발자입니다.

0개의 댓글

관련 채용 정보