문자열 메서드 — slice, includes, padStart부터 replaceAll까지
자바스크립트에서 문자열은 원시값이지만, 래퍼 객체 덕분에 다양한 메서드를 사용할 수 있습니다. 문자열 메서드는 항상 새 문자열을 반환 한다는 점을 기억하면 됩니다.
검색 메서드
includes, startsWith, endsWith
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
const str = "banana";
str.indexOf("a"); // 1 (첫 번째 위치)
str.lastIndexOf("a"); // 5 (마지막 위치)
str.indexOf("x"); // -1 (없으면)
// 두 번째 인자: 검색 시작 위치
str.indexOf("a", 2); // 3
추출 메서드
slice — 가장 많이 쓰는 추출
const str = "JavaScript";
str.slice(0, 4); // "Java"
str.slice(4); // "Script"
str.slice(-6); // "Script" (음수: 뒤에서부터)
str.slice(-6, -3); // "Scr"
substring vs slice
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
const input = " Hello World ";
input.trim(); // "Hello World"
input.trimStart(); // "Hello World "
input.trimEnd(); // " Hello World"
사용자 입력을 처리할 때 trim()은 필수입니다.
toUpperCase, toLowerCase
"hello".toUpperCase(); // "HELLO"
"HELLO".toLowerCase(); // "hello"
padStart, padEnd
// 앞을 채우기
"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
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에 함수 전달
// 매칭된 부분을 함수로 변환
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
"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
"Ha".repeat(3); // "HaHaHa"
"-".repeat(20); // "--------------------"
at — 음수 인덱스 접근 (ES2022)
const str = "Hello";
str.at(0); // "H"
str.at(-1); // "o" — 마지막 문자
str.at(-2); // "l"
// 기존 방식
str[str.length - 1]; // "o" — 더 장황함
유니코드 관련
// emoji와 서로게이트 페어
const emoji = "👨👩👧👦";
console.log(emoji.length); // 11 — 실제 "글자 수"와 다름
// 스프레드 연산자로 올바른 분리
console.log([...emoji]); // 유니코드 코드포인트 단위로 분리
// codePointAt / fromCodePoint
"A".codePointAt(0); // 65
String.fromCodePoint(65); // "A"
실전 유틸리티 패턴
// 첫 글자 대문자
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를 기본으로 기억하면 실무에서 대부분의 상황을 커버할 수 있습니다.
댓글 로딩 중...