자바스크립트 문자열

kiki97 ㅣ 2022. 9. 16. 04:08

반응형

문자열

텍스트 형식의 데이터는 길이에 상관없이 문자열 형태로 저장된다.

자바스크립트에서 문자열은 페이지 인코딩 방식과 상관없이 항상 UTF-16형식을 따른다.

 

따옴표의 종류

let single = '작은따옴표';
let double = "큰따옴표";

let backticks = `백틱`;
  • 작은따옴표와 큰따옴표는 기능상 차이가없다.

 

function sum(a, b) {
  return a + b;
}

alert(`1 + 2 = ${sum(1, 2)}.`); // 1 + 2 = 3.
  • 템플릿 리터럴 방식
  • 백틱으로 감싼 문자열 중간에 표현식${...}을 문자열 중간에 넣어주면 표현식을 삽입할 수 있다.

 

특수 기호

자바스크립트엔 줄 바꿈 문자를 비롯한 다양한 '특수' 문자들이 있다.

let guestList = "손님:\n * John\n * Pete\n * Mary";

alert(guestList); // 손님 리스트를 여러 줄에 걸쳐 작성함

손님:
 * John
 * Pete
 * Mary
  • 모든 특수 문자는 이스케이프 문자 라고도 불리는 역슬래시 \로 시작한다.

 

\n 줄 바꿈
\',\" 따옴표
\\ 역슬래시
\t

 

문자열의 길이

alert( `My\n`.length ); // 3
  • \n은 ‘특수 문자’ 하나로 취급되기 때문에 My\n의 길이는 3이다.
  • <주의> 자바스크립트에서 str.length는 함수가 아니라 프로퍼티이다. 뒤에 괄호를 붙일 필요는 없다.

 

특정 글자에 접근하기

let str = `Hello`;

// 첫 번째 글자
alert( str[0] ); // H
alert( str.charAt(0) ); // H

// 마지막 글자
alert( str[str.length - 1] ); // o

alert( str[1000] ); // undefined
alert( str.charAt(1000) ); // '' (빈 문자열)
  • [pos]같이 대괄호를 이용하거나 , str.charAt(pos)메소드 사용하기, 위치는 0부터 시작한다.
  • 최근에는 대괄호 이용방식을 사용하고 charAt은 하위 호환성을 위해 남아있는 메서드이다.
  • 두 접근 방식의 차이는 반환할 글자가 없을때 []는 undefined, charAt은 빈 문자열을 반환한다.

 

for (let char of "Hello") {
  alert(char); // H,e,l,l,o (char는 순차적으로 H, e, l, l, o가 됩니다.)
}
  • for..of를 사용하면 문자열을 구성하는 글자를 대상으로 반복 작업을 할 수 있다.

 

문자열의 불변성

let str = 'Hi';

str[0] = 'h'; // Error: Cannot assign to read only property '0' of string 'Hi'
alert( str[0] ); // 동작하지 않습니다.
  • 문자열은 수정할 수 없다. 따라서 문자열 중간 글자 하나를 바꾸려고하면 에러가 발생한다.

 

let str = 'Hi';

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

alert( str ); // hi
  • 이러한 문제를 피하려면 완전히 새로운 문자열을 하나 만든 다음, 이 문자열을 할당하면 된다.

 

대·소문자 변경하기

alert( 'Interface'.toUpperCase() ); // INTERFACE
alert( 'Interface'.toLowerCase() ); // interface

alert( 'Interface'[0].toLowerCase() ); // 'i'
  • toUpperCase() 소문자를 대문자로 변경
  • toLowerCase() 대문자를 소문자로 변경
  • 글자 하나의 케이스만 변경하는것도 가능하다.

 

부분 문자열 찾기 indexOf

let str = 'Widget with id';

alert( str.indexOf('Widget') ); // 0, str은 'Widget'으로 시작함
alert( str.indexOf('widget') ); // -1, indexOf는 대·소문자를 따지므로 원하는 문자열을 찾지 못함

alert( str.indexOf("id") ); // 1, "id"는 첫 번째 위치에서 발견됨 (Widget에서 id)
  • str.indexOf(substr, pos) 메서드
  • pos에서부터 시작해 substr이 어디에 위치하는지 찾아준다. (pos는 선택적으로 사용할 수 있다)
  • 원하는 부분 문자열을 찾으면 위치를 반환하고 그렇지 않으면 -1를 반환

 

문자열 전체돌며 부분 문자열 찾기

let str = 'As sly as a fox, as strong as an ox';

let target = 'as'; // as를 찾아봅시다.

let pos = 0;
while (true) {
  let foundPos = str.indexOf(target, pos);
  if (foundPos == -1) break;

  alert( `위치: ${foundPos}` );
  pos = foundPos + 1; // 다음 위치를 기준으로 검색을 이어갑니다.
}
  • 반복문이 하나씩 돌 때마다 검색 시작 위치가 갱신되면서 indexof가 새롭게 호출된다.

 

let str = "As sly as a fox, as strong as an ox";
let target = "as";

let pos = -1;
while ((pos = str.indexOf(target, pos + 1)) != -1) {
  alert( `위치: ${pos}` );
}
  • 위와 동일한 동작을하는 코드

 

includes, startsWith, endsWith

alert( "Widget with id".includes("Widget") ); // true

alert( "Hello".includes("Bye") ); // false

alert( "Widget".includes("id") ); // true
alert( "Widget".includes("id", 3) ); // false, 세 번째 위치 이후엔 "id"가 없습니다.
  • str.includes(substr, pos)는 str에 부분 문자열 substr이 있는지에 따라 true나 false를 반환
  • 두 번째 인수를 넘기면 해당 위치부터 부분 문자열을 검색한다.

 

alert( "Widget".startsWith("Wid") ); // true, "Widget"은 "Wid"로 시작합니다.
alert( "Widget".endsWith("get") ); // true, "Widget"은 "get"으로 끝납니다.
  • str.startsWith() - str이 특정 문장열로 시작하는지 여부확인
  • str.endsWith() - str이 특정 문자열로 끝나는지 여부확인

 

부분 문자열 추출하기

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번째부터 끝까지

alert( str.slice(-4, -1) ); // gif
  • str.slice(start [, end]) - 문자열의 strart부터 end까지(end는 미포함)을 반환한다.
  • 두 번째 인수가 생략된 경우엔 명시한 위치부터 문자열 끝까지 반환
  • start와 end는 음수가 될 수도 있고, 음수는 문자열 끝에서부터 카운팅 시작

 

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.substring(start [, end]) - start와 end 사이의 문자열 반환
  • slice와 아주 유사하지만 substring는 start값이 end보다 커도 되고, 인수로 음수를 허용하지 않는다. (음수는0처리)

 

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

alert( str.substr(-4, 2) ); // gi, 끝에서 네 번째 위치부터 글자 두 개
  • str.substr(start [, length]) - start에서 시작해 length개의 글자를 반환
  • substr은 끝 위치 대신에 길이를 기준으로 문자열을 추출한다는 점에서 위의 메소드들과 차이가 있다.

 

메서드 추출할 부분 문자열 음수 허용 여부(인수)
slice(start, end) start부터 end까지 (end 미포함) 음수 허용
substring(start, end) start와 end 사이 음수는 0으로 취급
substr(start, length) start부터 length개의 글자 음수 허용

 

⭐ 요약


  • 백틱은 문자열을 여러 줄에 걸쳐 쓸 수 있게 해주고 문자열 중간에 ${...}를 사용해 표현식도 넣을수 있음
  • 자바스크립트는 UTF-16을 사용해 문자열을 인코딩한다.
  • \n (줄바꿈) 같은 특수 문자 사용가능
  • 문자열에서 글자 하나 추출할때는 대괄호 [] 사용
  • 부분 문자열을 얻으려면 slice() 나 substring()
  • 소문자로 바꾸기 toLowerCase(), 대문자로 바꾸기 toUpperCase()
  • indexOf로 부분 문자열의 위치 얻기
  • 부분 문자열의 여부 확인 includes/startsWith/endsWith
  • str.trim() – 문자열 앞과 끝의 공백 문자를 다듬어 줌(제거함)
  • str.repeat(n) – 문자열을 n번 반복
반응형