문자열의 immutable(불변) 특성
- 문자열은 변경될 수 없습니다.
모든 메소드는 원본을 수정하지 않고 새 문자열을 반환합니다.
- 생성 방법
const literal = "hello"; // 문자열 리터럴
const obj = new String("hi"); // String 객체(권장 X)
🅰️ 문자 생성 & 유니코드
| 메소드 |
설명 |
사용 예 |
String.fromCharCode(65,66) |
UTF-16 코드 → 문자 |
"AB" |
String.fromCodePoint(0x1F600) |
코드 포인트 → 문자 |
"😀" |
const smile = String.fromCodePoint(0x1f604);
console.log(smile.codePointAt(0)); // 128516
📍 문자열 위치 & 포함 여부
| 메소드 |
기능 |
예시 결과 |
indexOf("l") |
첫 위치 |
2 |
lastIndexOf("l") |
마지막 위치 |
3 |
includes("he") |
포함? |
true |
startsWith("he") |
시작? |
true |
endsWith("o") |
끝? |
true |
"JavaScript".includes("Script"); // true
🔤 문자 추출 (개별 문자)
| 메소드 |
반환 |
특징 |
charAt(i) |
UTF-16 단위 |
이모지 절반만 반환 가능 |
charCodeAt(i) |
UTF-16 코드 |
0–65535 |
codePointAt(i) |
코드 포인트 |
이모지 안전 |
"😀".charAt(0); // �
"😀".codePointAt(0); // 128512
✂️ 부분 문자열 얻기
| 메소드 |
시그니처 |
특이사항 |
slice(start, end) |
음수 인덱스 OK |
배열 slice와 동작 동일 |
substring(start, end) |
음수 → 0 치환 |
작은 ↔ 큰 값 자동 교환 |
substr(start, len) |
표준 제외 예정 |
유지보수 코드만 |
"abcdef".slice(1, 4); // "bcd"
"abcdef".substring(1, 4); // "bcd"
🔧 문자열 조작 & 변환
| 목적 |
대표 메소드 |
스니펫 |
| 결합 |
concat, + |
"hello".concat(" ", "world") |
| 치환 |
replace, replaceAll |
"a-b".replace("-", "_") |
| 반복 |
repeat(n) |
"ha".repeat(3) → "hahaha" |
| 분리 |
split(",") |
"a,b".split(",") |
| 공백 |
trim() |
" foo ".trim() |
| 패딩 |
padStart, padEnd |
"7".padStart(3,"0") → "007" |
🔠 대소문자 & 로케일
| 메소드 |
설명 |
toUpperCase, toLowerCase |
기본 대·소문자 변환 |
toLocaleUpperCase, toLocaleLowerCase |
언어별(터키어 등) 변환 정확도 ↑ |
🔍 정규표현식 메소드
| 메소드 |
용도 |
예시 |
search(/b/) |
매칭 위치 |
"abc".search(/b/) → 1 |
match(/b/g) |
매칭 배열 |
"bob".match(/b/g) |
replace(/a/g,"z") |
패턴 치환 |
"aAa".replace(/a/gi,"z") |
💡 기타 유용 메소드
| 메소드 |
기능 |
localeCompare("str", "ko") |
정렬 시 크기 비교 |
normalize() |
유니코드 NFC/NFKC 등 정규화 |
valueOf() |
래퍼 객체 → 원시값 |
🛠️ 실전 예제
// 1) 전화번호 하이픈
const tel = "01012345678".replace(/(\d{3})(\d{4})(\d{4})/, "$1-$2-$3");
// 2) HTML 이스케이프
const safe = "<b>Hello</b>"
.replaceAll("&", "&")
.replaceAll("<", "<")
.replaceAll(">", ">");
// 3) CSV → 객체
const [name, age, city] = "홍길동,30,Seoul".split(",");
const user = { name, age: Number(age), city };
질문 정리
Q1. replace는 왜 첫 번째만 바뀌나요?
기본이 첫 매칭입니다. 모두 바꾸려면 replaceAll 또는 정규식 /pattern/g 를 사용하세요.
Q2. 이모지를 정확히 잘라내려면?
문자열을 스프레드([...]str)로 코드 포인트 배열로 바꾼 뒤 처리하거나 codePointAt·fromCodePoint를 쓰면 안전합니다.
Q3. substr를 계속 써도 되나요?
ECMA 표준에서 Deprecated 상태입니다. 신규 코드는 slice 또는 substring으로 교체하세요.
Q4. 대소문자 비교가 로케일마다 다른가요?
toUpperCase() 는 대부분 언어에 맞지만, 터키어(i·I)처럼 특수 규칙이 있는 경우 toLocaleUpperCase("tr")를 사용해야 합니다.
Q5. 문자열과 String 객체를 혼용해도 괜찮나요?
가급적 리터럴(“text”) 을 사용하세요. 객체 래핑은 타입 혼란(typeof === "object")과 성능 저하를 초래할 수 있습니다.
🔑 핵심 메소드 TOP 10 요약
| 목적 |
메소드 |
| 위치 확인 |
indexOf, includes |
| 추출 |
slice, charAt |
| 대·소문자 |
toUpperCase, toLowerCase |
| 분할 |
split |
| 결합 |
concat, + |
| 공백 제거 |
trim |
| 치환 |
replace, replaceAll |
| 반복 |
repeat |
| 정규식 |
match, search |
| 유니코드 |
fromCodePoint, codePointAt |
댓글남기기