[JS String] 흔한 오해 해소: 불변성과 Template Literals 활용법

2025-11-17

JavaScript에서 String 객체는 텍스트 데이터를 다룰 때 필수적이죠. 하지만 사용하다 보면 몇 가지 흔한 문제에 부딪힐 수 있어요.

JavaScript의 문자열은 한 번 생성되면 그 내용을 변경할 수 없습니다. 문자열 메서드는 새로운 문자열을 반환합니다.

문제
문자열 메서드를 사용했지만 원본 변수의 값이 바뀌지 않는다고 생각할 때.

해결
메서드의 반환 값을 새로운 변수에 할당하거나, 기존 변수에 다시 할당해야 합니다.

문제 코드 (Bad Practice)해결 코드 (Good Practice)
javascript\nlet str = "Hello World";\nstr.toUpperCase(); // 원본은 바뀌지 않음\nconsole.log(str); // "Hello World"javascript\nlet str = "Hello World";\nlet newStr = str.toUpperCase(); // 새로운 변수에 할당\nconsole.log(newStr); // "HELLO WORLD"

덧셈 (+) 연산자를 사용할 때, 피연산자 중 하나가 문자열이면 나머지 피연산자도 문자열로 변환되어 문자열 연결이 일어납니다.

문제
숫자 덧셈을 기대했지만 문자열 연결이 발생할 때.

해결
명시적으로 숫자로 변환하거나, 덧셈 연산을 먼저 수행하도록 괄호를 사용합니다.

문제 코드 (Type Coercion Issue)해결 코드 (Correct Calculation)
javascript\nlet num = 10;\nlet result = "Score: " + num + 5;\nconsole.log(result); // "Score: 105" (문자열 연결)javascript\nlet num = 10;\nlet result = "Score: " + (num + 5); // 괄호로 덧셈 우선\nconsole.log(result); // "Score: 15"

전통적인 + 연산자는 복잡하거나 긴 문자열을 만들 때 가독성이 떨어지고 성능상의 미세한 이슈가 있을 수 있습니다.

ES6에 도입된 백틱(``)을 사용하는 템플릿 리터럴은 문자열 안에 변수나 표현식을 쉽게 삽입할 수 있어 훨씬 깔끔합니다.

// 기존 방식
const name = "Alice";
const age = 30;
const greeting_old = "안녕하세요, " + name + "님. 나이는 " + age + "살 입니다.";
console.log(greeting_old);

//  대체 방법: 템플릿 리터럴
const greeting_new = `안녕하세요, ${name}님. 나이는 ${age}살 입니다.`;
console.log(greeting_new);

substring(), substr(), slice()는 모두 부분 문자열을 추출하지만, 동작 방식에 약간의 차이가 있어 혼동을 줄 수 있습니다. 특히 substr()은 레거시 기능으로 간주됩니다.

가장 일관성 있고 널리 사용되는 slice()를 기준으로 사용하는 것이 좋습니다. 음수 인덱스도 지원합니다 (문자열 끝에서부터 계산).

const sentence = "The quick brown fox.";

//  `substring(시작, 끝)`: 음수 인덱스를 0으로 취급
const sub1 = sentence.substring(4, 9); // "quick"

//  대체 방법: `slice(시작, 끝)`: 음수 인덱스 지원
const sub2 = sentence.slice(4, 9);      // "quick"
const sub3 = sentence.slice(-4);        // "fox." (뒤에서 4번째 문자부터 끝까지)

console.log(sub2);
console.log(sub3);

특정 문자열이 포함되어 있는지 확인할 때 indexOf()를 사용하고 반환 값이 -1인지 확인하는 것은 조금 번거롭습니다.

이 메서드들은 더 명확하고 간결하게 문자열 포함 여부나 시작/끝 문자열을 확인할 수 있도록 불리언 값(Boolean)을 반환합니다.

const email = "[email protected]";

// 기존 방식 (indexOf)
const isCom_old = email.indexOf(".com") !== -1;
console.log(`기존 방식 (.com 포함?): ${isCom_old}`);

//  대체 방법 1: `includes()`
const isCom_new = email.includes(".com");
console.log(`includes() 방식 (.com 포함?): ${isCom_new}`);

//  대체 방법 2: `endsWith()` (문자열의 끝 확인)
const isEndingCom = email.endsWith(".com");
console.log(`endsWith() 방식 (.com으로 끝남?): ${isEndingCom}`);

특정 문자열을 여러 번 반복해야 할 때 루프를 사용하는 대신 repeat() 메서드를 사용할 수 있습니다.

// 기존 방식 (for 루프)
let star_old = "";
for (let i = 0; i < 5; i++) {
    star_old += "*";
}
console.log(`기존 방식: ${star_old}`);

//  대체 방법: `repeat()`
const star_new = "*".repeat(5);
console.log(`repeat() 방식: ${star_new}`);

이러한 대체 방법들을 사용하면 코드가 더 간결하고, 가독성이 높으며, 유지보수가 쉬워집니다. JavaScript String 객체를 다루는 데 도움이 되셨기를 바라요!


javascript



Proxy defineProperty 트랩으로 객체에 유효성 검사(Validation) 적용하기

친절하고 자세하게 설명해 드릴게요.Proxy는 '대리인'이라는 뜻 그대로, 어떤 타겟 객체(target)의 모든 기본 동작(속성 읽기, 쓰기, 정의 등)을 가로채서(trap) 우리가 원하는 대로 재정의할 수 있게 해주는 객체예요


getMonth()가 9월을 8로 반환하는 이유: JS 날짜 객체 월 처리 가이드

$\text{Date. getMonth()}$를 사용할 때 개발자들이 가장 많이 겪는 혼란은 바로 '0-기반 인덱스' 때문이에요.Date. getMonth() 메서드는 현재 날짜의 월을 0부터 11 사이의 정수로 반환합니다


JS 상속: super() 호출 순서와 횟수, 이것만 알면 에러 해결 끝!

이 에러는 주로 자식 클래스(Derived Class)의 생성자(constructor) 내에서 부모 클래스(Base Class)의 생성자를 호출할 때 사용하는 super() 키워드를 잘못 사용했을 때 발생해요.클래스 상속(Inheritance)에서 자식 클래스의 생성자는 this 키워드를 사용하기 전에 반드시 super()를 호출해서 부모 클래스를 초기화해야 합니다



자바스크립트 typeof 연산자의 함정: null과 배열을 객체로 처리하는 이유와 해결책

typeof 연산자는 변수나 값의 데이터 유형을 문자열로 반환하는 단항 연산자예요. 어떤 값이 number인지, string인지 등을 빠르게 확인하고 싶을 때 사용하죠.기본 사용법typeof 연산자가 대부분의 기본 타입에 대해서는 정확한 값을 반환하지만


[JS 기초 다지기] 속성 접근자(., []) 완벽 이해와 실전 팁

속성 접근자는 객체(Object)의 속성(Property)에 접근하거나 값을 설정할 때 사용하는 연산자예요. 크게 두 가지 방식이 있답니다.점 표기법 (Dot notation) object. property대괄호 표기법 (Bracket notation) object['property'] 또는 object[expression]


고성능 JS를 위한 Atomics.isLockFree()의 역할과 트러블 슈팅

Atomics. isLockFree(size) 메서드는 특정 크기의 요소(바이트 단위)에 대해 Atomics 연산이 하드웨어 수준의 원자적(atomic) 연산을 사용하여 락(lock) 없이 수행될 수 있는지 여부를 확인하는 정적(static) 메서드입니다


JavaScript Intl.Locale: 완벽한 국제화를 위한 로케일 객체 활용 가이드

친절하고 자세하게, 그리고 가장 중요한 것은 흔히 발생하는 문제와 대체 방법의 예시 코드를 곁들여 한국어로 설명해 드릴게요.Intl. Locale 객체는 특정 언어와 지역 정보(로케일)를 나타내기 위해 설계되었습니다


태그로 감싼 코드 블록 형태로 출력하겠습니다.

Object. entries란?JavaScript의 Object. entries() 메서드는 객체(Object)에 있는 열거 가능한(enumerable) 속성(property)의 키(key)와 값(value) 쌍을 [key


JavaScript 배열 상속: Symbol.species로 서브클래스 인스턴스 유지하기

이 프로퍼티는 배열을 상속받는 서브클래스에서 특정 배열 메서드(예 map, filter, slice 등)를 호출했을 때, 그 결과로 반환될 새로운 배열 객체의 생성자를 지정하는 데 사용됩니다. 즉, 메서드 실행 후 결과를 담을 "종(species)"을 정의하는 것이죠


배열/객체 구조 분해 할당, 안전하게 쓰는 팁: 기본값과 나머지 매개변수 활용

Destructuring Assignment는 배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 쉽게 담을 수 있도록 해주는 문법이에요. 코드를 훨씬 간결하고 가독성 좋게 만들어주죠! 하지만 몇 가지 주의해야 할 점들이 있답니다