25. String

표준 빌트인 객체 String

Index

String 생성자 함수

length 프로퍼티

String 메서드


1. String 생성자함수

1.1 String 객체 생성방법

  • String 래퍼객체는 new String()을 사용해 생성할 수 있습니다. 예를 들어, new String('Lee')처럼 문자열을 감싸 객체로 만듭니다.

1.2 String 객체의 특성

  • String 래퍼객체는 내부에 문자열 데이터를 저장하며, [[PrimitiveValue]]라는 내부슬롯에 원본 문자열(기본타입)을 가지고 있습니다.
  • String 객체의 메서드는 이 [[PrimitiveValue]]를 기반으로 동작하지만, 원본 데이터를 직접 수정하지는 않습니다.

1.3 불변성

  • String 래퍼객체는 불변(immutable)입니다. 즉, String 객체의 메서드를 호출하면 원본 문자열이 바뀌지 않고, 항상 새로운 문자열을 생성해서 반환합니다.

1.4 예시

  • const strObj = new String()l → 빈 문자열 객체 생성. 출력: {length: 0, [[PrimitiveValue]]: ""}
  • const strObj = new String("Lee"); → “Lee”를 가진 객체 생성. 출력: {0: “L”, 1: “e”, 2: “e”, length: 3, [[PrimitiveValue]]: “Lee”}

1.5 핵심포인트

  • String 래퍼객체는 기본 타입 문자열을 감싸 객체로 만들고, 불변성을 유지하며 동작합니다.
  • 내부적으로 [[PrimitiveValue]]를 통해 원본 문자열을 저장하며, 메서드 호출 시 원본은 변경되지 않고 새 문자열을 반환합니다.



2. length 프로퍼티

length 프로퍼티는 문자열의 문자 개수를 반환한다.

String 래퍼 객체는 배열과 마찬가지로 length 프로퍼티를 갖는다. 그리고 인덱스를 나타내는 숫자를 프로퍼티 키로, 각 문자를 프로퍼티 값으로 가지므로 String 래퍼 객체는 유사 배열 객체다.

'Hello'.length; // 5
'안녕하세요'.length; // 6



3. String 메서드

String 객체에는 원본 String 래퍼 객체(String 메서드를 호출한 String 래퍼 객체)를 직접 변경하는 메서드는 존재하지 않는다. 즉, String 객체의 메서드는 언제나 새로운 문자열을 반환한다. 문자열은 변경 불가능한 원시 값이기 때문에 String 래퍼 객체도 읽기 전용(read only) 객체로 제공된다.

const strobj = new String("Lee");
console.log(Object.get0wnPropertyDescriptors(str0bj));
/* String 래퍼 객체는 읽기 전용 객체다. 즉, writable 프로퍼티 어트리뷰트 값이 false다.
{
'0': { value: 'L', writable: false, enumerable: true, configurable: false },
'1': { value: 'e', writable: false, enumerable: true, configurable: false },
'2': { value: 'e', writable: false, enumerable: true, configurable: false }, 
length: { value: 3, writable: false, enumerable: false, configurable: false }
}
*/

🧐 Q. 왜 래퍼객체(Wrapper) 라고 하나요?

Answer)

“래퍼(wrapper)”라는 용어는 영어에서 “감싸다” 또는 “포장하다”라는 뜻을 가지고 있습니다. 즉, 기본 타입인 문자열을 단순히 값으로만 두지 않고, 객체로 “감싸서” 더 많은 기능을 붙여주는 역할을 한다는 의미입니다. 그냥 “객체”라고만 부르지 않고 “래퍼객체”라고 하는 이유는 이 객체가 기본 타입을 기반으로 만들어졌으며, 그 목적이 기본 타입을 확장하거나 다루기 쉽게 하기 위한 도구라는 점을 강조하기 위해서입니다.

예를 들어, 자바스크립트에서:

  • 기본 타입 string인 “hello”는 그 자체로는 메서드를 직접 호출할 수 없습니다.
  • 하지만 “hello”.toUpperCase()처럼 메서드를 호출하면, 자바스크립트 엔진이 자동으로 이 기본 타입을 String 래퍼객체로 변환(오토박싱, autoboxing)해서 HELLO라는 결과를 돌려줍니다.

즉, 래퍼객체는 기본 타입을 “포장”해서 객체처럼 다룰 수 있게 해주는 중간 다리 역할을 합니다. 그래서 일반적인 객체랑은 조금 다른 뉘앙스를 주기 위해 “래퍼”라는 수식어를 붙이는 거죠.


🧐 Q. String 객체의 모든 메서드는 String 래퍼 객체를 직접 변경할 수 없고, String 객체의 메서드는 언제나 새로운 문자열을 생성하여 반환한다. 이유는 무엇일까?

Answer)

프로그래밍에서 “불변성”(immutability)이 중요한 이유는, 데이터의 일관성을 유지하고 예상치 못한 부작용(side effect)을 방지하기 위함입니다. 예를 들어, 원본 문자열을 바꾸지 않으면 다른 코드에서 의도치 않게 영향을 받지 않게 됩니다.

ex)

  • let str = "hello;”

  • let upperStr = str.toUpperCase(); // upperStr은 “HELLO”가 되고, str은 여전히 “hello”입니다.

  • 여기서 toUpperCase()는 새로운 문자열을 생성해서 반환한 것이지, str 자체를 바꾸지 않았습니다.




reference: 모던자바스크립트 Deep Dive 32장. String