자바스크립트에서 문자열은 원시값이지만, 래퍼 객체 덕분에 다양한 메서드를 사용할 수 있습니다. 문자열 메서드는 항상 새 문자열을 반환 한다는 점을 기억하면 됩니다.

검색 메서드

includes, startsWith, endsWith

JS
const str = "Hello, JavaScript!";

str.includes("Java");     // true
str.startsWith("Hello");  // true
str.endsWith("!");         // true

// 대소문자를 구분합니다
str.includes("java");     // false

// 대소문자 무시 검색
str.toLowerCase().includes("java"); // true

indexOf, lastIndexOf

JS
const str = "banana";

str.indexOf("a");      // 1 (첫 번째 위치)
str.lastIndexOf("a");  // 5 (마지막 위치)
str.indexOf("x");      // -1 (없으면)

// 두 번째 인자: 검색 시작 위치
str.indexOf("a", 2);   // 3

추출 메서드

slice — 가장 많이 쓰는 추출

JS
const str = "JavaScript";

str.slice(0, 4);   // "Java"
str.slice(4);      // "Script"
str.slice(-6);     // "Script" (음수: 뒤에서부터)
str.slice(-6, -3); // "Scr"

substring vs slice

JS
const str = "Hello";

// substring은 음수를 0으로 취급
str.substring(-3);     // "Hello" (0으로 처리)
str.slice(-3);         // "llo"

// substring은 인자 순서를 자동 정렬
str.substring(4, 1);   // "ell" (1, 4로 자동 교환)
str.slice(4, 1);       // "" (빈 문자열)

실무에서는 slice를 쓰는 것이 일반적입니다. 음수 인덱스 지원이 직관적이기 때문입니다.

변환 메서드

trim, trimStart, trimEnd

JS
const input = "  Hello World  ";

input.trim();      // "Hello World"
input.trimStart(); // "Hello World  "
input.trimEnd();   // "  Hello World"

사용자 입력을 처리할 때 trim()은 필수입니다.

toUpperCase, toLowerCase

JS
"hello".toUpperCase(); // "HELLO"
"HELLO".toLowerCase(); // "hello"

padStart, padEnd

JS
// 앞을 채우기
"5".padStart(3, "0");    // "005"
"42".padStart(5, " ");   // "   42"

// 뒤를 채우기
"Hi".padEnd(10, ".");    // "Hi........"

// 실전: 날짜 포맷팅
const month = String(3).padStart(2, "0"); // "03"
const day = String(7).padStart(2, "0");   // "07"
console.log(`2026-${month}-${day}`);      // "2026-03-07"

// 실전: 카드 번호 마스킹
const cardNumber = "1234567890123456";
const masked = cardNumber.slice(-4).padStart(16, "*");
console.log(masked); // "************3456"

치환 메서드

replace, replaceAll

JS
const str = "foo bar foo baz foo";

// replace — 첫 번째만 치환
str.replace("foo", "qux"); // "qux bar foo baz foo"

// replaceAll — 전부 치환 (ES2021)
str.replaceAll("foo", "qux"); // "qux bar qux baz qux"

// 정규식으로 전체 치환 (replaceAll 이전 방식)
str.replace(/foo/g, "qux"); // "qux bar qux baz qux"

replace에 함수 전달

JS
// 매칭된 부분을 함수로 변환
const result = "hello world".replace(/\b\w/g, (char) => char.toUpperCase());
console.log(result); // "Hello World"

// 템플릿 변수 치환
const template = "안녕하세요, {{name}}님! {{age}}세이시군요.";
const data = { name: "정훈", age: 25 };

const filled = template.replace(/\{\{(\w+)\}\}/g, (_, key) => data[key] || "");
console.log(filled); // "안녕하세요, 정훈님! 25세이시군요."

분리와 결합

split

JS
"a,b,c".split(",");     // ["a", "b", "c"]
"Hello".split("");       // ["H", "e", "l", "l", "o"]
"a::b::c".split("::");  // ["a", "b", "c"]

// 두 번째 인자: 최대 개수
"a,b,c,d".split(",", 2); // ["a", "b"]

repeat

JS
"Ha".repeat(3);  // "HaHaHa"
"-".repeat(20);  // "--------------------"

at — 음수 인덱스 접근 (ES2022)

JS
const str = "Hello";

str.at(0);   // "H"
str.at(-1);  // "o" — 마지막 문자
str.at(-2);  // "l"

// 기존 방식
str[str.length - 1]; // "o" — 더 장황함

유니코드 관련

JS
// emoji와 서로게이트 페어
const emoji = "👨‍👩‍👧‍👦";
console.log(emoji.length);     // 11 — 실제 "글자 수"와 다름

// 스프레드 연산자로 올바른 분리
console.log([...emoji]);       // 유니코드 코드포인트 단위로 분리

// codePointAt / fromCodePoint
"A".codePointAt(0);            // 65
String.fromCodePoint(65);      // "A"

실전 유틸리티 패턴

JS
// 첫 글자 대문자
function capitalize(str) {
  return str.charAt(0).toUpperCase() + str.slice(1);
}

// camelCase → kebab-case
function toKebabCase(str) {
  return str.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);
}
console.log(toKebabCase("backgroundColor")); // "background-color"

// 문자열 뒤집기
function reverse(str) {
  return [...str].reverse().join("");
}
console.log(reverse("Hello")); // "olleH"

** 기억하기 **: 문자열 메서드는 원본을 변경하지 않고 항상 새 문자열을 반환합니다. 추출에는 slice, 치환에는 replaceAll, 포맷팅에는 padStart를 기본으로 기억하면 실무에서 대부분의 상황을 커버할 수 있습니다.

댓글 로딩 중...