Language/JavaScript

[모던 JavaScript] 5.3 문자열

뚜sh뚜sh 2023. 2. 3. 13:37

 

모든 문자열은 UTF-16을 사용해 인코딩됨

 

 

따옴표

- 문자열은 작은 따옴표나, 큰 따옴표, 백틱으로 감쌀 수 있음

- 템플릿 리터럴 : 표현식을 ${...}로 감싸고 이를 백틱으로 감ㅅ싼 문자열 중간에 넣어주면 해당 표현식을 문자열 중간에 쉽게 삽입할 수 있음

- 백틱을 사용하면 문자열을 여러 줄에 걸쳐 작성할 수도 있음

 

 

 

특수 기호

- '줄 바꿈 문자'라 불리는 특수기호 \n을 사용하면 작은 따옴표나 큰 따옴표로도 여러 줄 문자열을 만들 수 있음

- 문자열 내의 따옴표를 사용하기 위해서는 \' 의 형태로 사용해야 함

- 역슬래시 \를 보여주려면 \\ 의 형태로 사용해야 함

 

 

 

문자열의 길이

- length 프로퍼티엔 문자열의 길이가 저장됨

- length는 함수가 아니고, 숫자가 저장되는 프로퍼티라서 뒤에 괄호를 붙일 필요가 없음

- \n은 특수 문자로 취급되기 때문에 아래 결과가 3임

alert( `My\n`.length ); // 3

 

 

 

특정 글자에 접근하기

- 문자열 내의 특정 위치인 pos에 있는 글자에 접근하려면 [pos]와 같이 대괄호를 이용하거나 str.charAt(pos)라는 메서드를 호출하면 됨

- 두 접근 방식의 차이는 반환할 글자가 없을 때 드러남

- 접근하려는 위치에 글자가 없는 경우 [] 는 undefined, charAt은 빈 문자열을 반환함

let str = `Hello`;

alert( str[1000] ); // undefined
alert( str.charAt(1000) ); // '' (빈 문자열)

 

- for..of를 사용하면 문자열을 구성하는 글자를 대상으로 반복 작업을 할 수 있음

for (let char of "Hello") {
  alert(char); // H,e,l,l,o (char는 순차적으로 H, e, l, l, o가 됩니다.)
}

 

 

 

문자열의 불변성

- 문자열은 수정할 수 없음

- 문자열의 중간 글자 하나를 바꾸려고 하면 에러가 발생함

let str = 'Hi';

str[0] = 'h'; // Error: Cannot assign to read only property '0' of string 'Hi'
alert( str[0] ); // 동작하지 않습니다.

 

- 이런 문제를 피하려면 완전히 새로운 문자열을 하나 만든 다음, 이 문자열을 str에 할당하면 됨

let str = 'Hi';

str = 'h' + str[1]; // 문자열 전체를 교체함

alert( str ); // hi

 

 

 

대.소문자 변경하기

- 메서드 toLowerCase()와 toUpperCase()는 대문자를 소문자로, 소문자를 대문자로 변경시켜줌 

- 글자 하나의 케이스만 변경도 가능

alert( 'Interface'[0].toLowerCase() ); // 'i'

 

 

 

부분 문자열 찾기

- str.indexOf(substr, pos) : 문자열 str의 pos 에서부터 시작해, 부분 문자열 substr이 어디에 위치하는 지를 찾아줌

- str.lastIndexOf(substr, position) : indexOf와 유사한 기능을 하는 메서드, 문자열 끝에서부터 부분 문자열을 찾음

 

 

 

비트 NOT 연산자를 사용한 기법

- 비트 NOT 연산자는 피연산자를 32비트 정수로 바꾼 후 모든 비트를 반전함

- 따라서 n이 32비트 정수일 때 ~n은 -(n+1)이 됨

alert( ~2 ); // -3, -(2+1)과 같음
alert( ~1 ); // -2, -(1+1)과 같음
alert( ~0 ); // -1, -(0+1)과 같음
alert( ~-1 ); // 0, -(-1+1)과 같음

 

 

 

includes

- str.includes(substr, pos) : str에 부분 문자열 substr이 있는지에 따라 true나 false를 반환함

- 부분 문자열의 위치 정보는 필요하지 않고 포함 여부만 알고 싶을 때 적합한 메서드

 

 

 

startsWith, endsWith

- str.startsWith와 str.endsWith 는 메서드 이름 그대로 문자열 str이 특정 문자열로 시작하는지 여부와 특정 문자열로 끝나는지 여부를 확인 할 때 사용할 수 있음

 

 

 

부분 문자열 추출하기

- 부분 문자열 추출과 관련된 메서드 3가지가 있음 (substring, substr, slice)

- str.slice(start [, end]) : 문자열의 start부터 end까지 (end는 미포함) 를 반환함

let str = "stringify";
alert( str.slice(0, 5) ); // 'strin', 0번째부터 5번째 위치까지(5번째 위치의 글자는 포함하지 않음)
alert( str.slice(0, 1) ); // 's', 0번째부터 1번째 위치까지(1번째 위치의 자는 포함하지 않음)

alert( str.slice(2) ); // ringify, 2번째부터 끝까지

// 끝에서 4번째부터 시작해 끝에서 1번째 위치까지
alert( str.slice(-4, -1) ); // gif

 

- str.substring(start [, end]) : start와 end 사이에 있는 문자열을 반환함

- slice와 아주 유사하지만 start가 end보다 커도 괜찮다는 데 차이가 있음

- substring은 음수를 허용하지 않음

let str = "stringify";

// 동일한 부분 문자열을 반환합니다.
alert( str.substring(2, 6) ); // "ring"
alert( str.substring(6, 2) ); // "ring"

// slice를 사용하면 결과가 다릅니다.
alert( str.slice(2, 6) ); // "ring" (같음)
alert( str.slice(6, 2) ); // "" (빈 문자열)

 

- str.substr(start, [, length]) : start에서부터 시작해 length 개의 글자를 반환함

let str = "stringify";
alert( str.substr(2, 4) ); // ring, 두 번째부터 글자 네 개

 

 

 

문자열 비교하기

1. 소문자는 대문자보다 항상 큼

2. 발음 구별 기호가 붙은 문자는 알파벳 순서 기준을 따르지 않음

 

- str.codePointAt(pos) : pos에 위치한 글자의 코드를 반환함

// 글자는 같지만 케이스는 다르므로 반환되는 코드가 다릅니다.
alert( "z".codePointAt(0) ); // 122
alert( "Z".codePointAt(0) ); // 90

 

- String.fromCodePoint(code) : 숫자 형식의 code에 대응하는 글자를 만들어줌

alert( String.fromCodePoint(90) ); // Z

 

- \u 뒤에 특정 글자에 대응하는 16진수 코드를 붙이는 방식으로도 원하는 글자를 만들 수 있음

// 90을 16진수로 변환하면 5a입니다.
alert( '\u005a' ); // Z

 

 

 

문자열 제대로 비교하기

- str.localeCompare(str2)를 호출하면 ECMA-402에서 정의한 규칙에 따라 str이 str2보다 작은지, 같은지 큰지를 나타내주는 정수가 반환됨

- str이 str2보다 작으면 음수 반환

- str이 str2보다 크면 양수 반환

- 같으면 0 반환

 

 

 

- str.trim() : 문자열 앞과 끝의 공백 문자를 다듬어 줌(제거함)

- str.repeat(n) : 문자열을 n번 반복함