2 분 소요

문자열의 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("&", "&amp;")
  .replaceAll("<", "&lt;")
  .replaceAll(">", "&gt;");

// 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

카테고리:

업데이트:

댓글남기기