프로그래밍 언어/JavaScript

[JavaScript] 문자열 메소드(String Method)

민졈 2022. 2. 24. 11:30

 

이번 시간에는 문자열과 관련된 여러가지 메소드를 배워볼 것이다.

 

 

우선 문자열은 '(작은 따옴표) , "(큰 따옴표) , `(백틱)을 사용하여 나타낼 수 있는데

 

html 코드 같은 경우는 작은 따옴표로 감싸는게 편하다.

태그 안에 큰 따옴표를 써야하는 상황이 있기 때문이다.

let html = '<div class="box_title">제목 영역</div>';

 

 

반면 영어로 된 문자열은 큰 따옴표로 감싸는게 편하다.

문자열 안에 작은 따옴표를 써야하는 상황이 있기 때문이다.

let desc = "It's 3 o'clock.";

 

 

 

백틱은 $와 중괄호 { } 를 사용해 변수를 표현하거나 표현식에 사용할 수 있다.

let name = 'Jane';
let result = `My name is ${name}`;  //My name is Jane;
let add = `2 더하기 3은 ${2+3}입니다.`; // 2더하기 3은 5입니다.

 또한 백틱은 여러줄을 표현할 수 있다.

let todayWeather = `오늘은 맑고 화창한 날씨가
계속 되겠습니다.
내일은 비소식이 있겠습니다.`;

 

 

만약 따옴표로 여러줄을 표현하려면 \(역슬레쉬)n을 사용해야 한다.

 

그리고 백틱처럼 줄 바꿈을 해서 사용할 수 없다. 

여러줄을 나타내더라도 무조건 한줄로 써줘야한다.

let desc = '오늘은 맑고 \n 화장한 날씨가 \n 계속되겠습니다.';

 

 

 

 

1. length를 사용한 문자열 길이 구하기

우리는 배열의 길이를 구할 때 length를 사용해서 배열의 길이를 구했는데

length를 사용해서 문자열의 길이도 구할 수 있다.

let desc = '안녕하세요';
desc.length // 6

 

 

 

2. 특정 위치에 접근

 

또한 문자열도 배열처럼 특정 위치에 접근할 수 있다.

배열처럼 index는 0부터 시작하기 때문이다.

 

let desc = '안녕하세요';
desc[2] // '하

 

 

배열과 다른점은 특정 문자를 바꿀 수 없다는 것이다.

let desc = '안녕하세요';

desc[2] // '하
desc[4] = '용';

console.log(desc);  // 안녕하세요

 

 

 

 

3. toUpperCase( ) / toLowerCase( ) 대 / 소문자 변경

toUpperCase는 모든 문자열을 대문자로, toLowerCase는 모든 문자열을 소문자로 바꿔준다.

let content = 'Hi guys. Nice to meet you';

content.toUpperCase();  //  "HI GUYS. NICE TO MEET YOU"

content.toLowerCase();  // "hi guys. nice to meet you"

 

 

 

 

4. str.indexOf(text)

: 문자를 인수로 받아 몇번째에 위치하는지 알려준다.

마찬가지로 문자열의 인덱스는 0부터 시작한다.

let content = 'Hi guys. Nice to meet you';

content.indexOf('to');  // 14

 

 

하지만 문자열에 포함된 문자가 아니라면 -1을 반환한다.

 

그리고 같은 문자열이 반복된다면 첫번째에 해당하는 인덱스만 반환해준다.

let content = 'Hi guys. Nice to meet you';

content.indexOf('to');  // 14
content.indexOf('men');  // -1

 

 

 

아래의 함수는 실행이 될까??

let content = 'Hi guys. Nice to meet you';

if(content.indexOf('Hi')) {
  console.log('Hi가 포함된 문장입니다.');
}

 

 

 

 

 

 

 

정답은 NO! 실행되지 않는다 ! !

 

왜냐하면 Hi는 문자열의 0번째에 위치하고 if 문에서 0은 false이고 조건절을 반환하지 않기 때문이다.

그래서 console.log를 찍고 싶으면 -1 보다 큰지 비교해줘야 한다.

if(content.indexOf('Hi') > -1) {
  console.log('Hi가 포함된 문장입니다.');
}

 

 

 

 

5. str.slice(n, m)

: n부터 m까지의 문자열만 반환한다.

 

여기서 n은 시작점이고 m은 숫자를 넣지 않으면 문자열 끝까지,

양수면 그 숫자까지(포함하지 않음, 미만을 나타냄),

음수면 끝에서부터 센다.

let eng = 'abcdefg';

eng.slice(3); // "defg"
eng.slice(1, 3);  // "bc"
eng.slice(2, -2); //  "cde"

 

 

 

 

6. str.subString(n, m)

: slice와 마찬가지로 n과 m 사이의 문자열을 반환한다.

 

다른점은 m을 포함한다는 것이고, n과 m을 바꿔도 똑같은 값을 반환한다.

음수를 허용하지 않아서 음수를 0으로 인식한다.

let eng = 'abcdefg';

eng.substring(2, 5); // "cde"
eng.substring(5, 2); // "cde"

 

 

 

 

 

7. str.substr(n, m)

: subString과 비슷하게 생겼지만 동작 방식은 조금 다르다.

 

n이 시작인 것은 똑같지만 m이 종료점이 아닌 갯수를 나타낸다.

즉, n번째부터 m개를 반환하는 것이다.

let eng = 'abcdefg';

eng.substr(2, 4); // "cdef"
eng.substr(-4, 2); // "de"

 

 

 

 

 

8. str.trim( )

: 앞 뒤 공백을 제거하는 메소드이다.

let trimString = "  coding        ";

trimString.trim();  // "coding"

 

 

 

 

 

 

9. str.repeat(n)

: 문자열을 n번 반복하게 하는 메소드이다.

let sayHi = "Hello~";

sayHi.repeat(4);  // "Hello~Hello~Hello~Hello~"

 

 

 

 

10. includes( )

: 인덱스로 문자열을 가져와서 비교하지 않고 문자열에 검사하고자 하는 문자가 있으면 true / false로 반환해주는 메소드이다.

let content = "오늘의 날씨는 맑음입니다.";

content.includes("날씨");  // true
content.includes("내일");  // false

 

 

 

 

 

숫자를 비교할 수 있는 것처럼 문자열도 비교할 수 있다.

"a" < "c"   // true;

이유는 소문자 a는 10진법으로 바꾸면 97을, c는 99를 나타내고 있기 때문이다.

 

 

 

codePointAt을 사용하면 해당하는 문자열의 10진법 숫자를,

반대로 fromCodePoint를 사용하면 10진법 숫자에 해당하는 문자열을 알아낼 수 있다.

"a".codePointAt(0); // 97
String.fromCodePoint(97); // "a"

 

 

 

자 메소드를 배워봤으니 조금 간단한 예제를 풀어보자

 

let list = [
  "01. 시작하는 말 ",
  "02. JS의 역사",
  "03. 자료형",
  "04. 함수",
  "05. 배열"
];

위의 리스트에서 숫자를 뺀 나머지 문자열만 가져와서 배열에 넣고싶다면 어떻게 해야할까??

 

 

 

 

1. 우선 빈 문자열을 만든다.
let newList = [];


2. 리스트의 길이만큼 반복하면서
for (let i = 0; i < list.length; i++) {
  4. newList에 집어넣는다.
  newList.push(
                   3. list의 i 번째 인덱스에서 slice 4번부터 끝까지의 문자열을 가져와서
                   list[i].slice(4));
 
}
                                // 숫자들을 제외한 문자열이 다 잘 들어간 것을 확인할 수 있다.
console.log(newList); // ["시작하는 말", "JS의 역사", "자료형", "함수형", "배열"]

 

 

 

두번째 예제로 금칙어가 있으면 금칙어가 있다고 알려주고 없으면 통과라고 알려주는 메소드를 만들어보자.

// 금칙어 : 치킨

function eatChicken(str) {
  if(str.indexOf('치킨')) {
    console.log('금칙어가 있습니다.');
  } else {
    console.log('통과~!!');
  }
}

eatChicken('치킨 먹고싶다 !!!');
eatChicken('오 나도 치킨 먹고싶다!');
eatChicken('아.. 나는 그거 말고 피자');

 

이렇게 함수를 작성했을 때 원래 의도했던 데로 작동하는지 확인해보면

전혀 다르게 작동하는 것을 볼 수 있다.

eatChicken('치킨 먹고싶다 !!!');  // 통과~!!
eatChicken('오 나도 치킨 먹고싶다!');  // 금칙어가 있습니다.
eatChicken('아.. 나는 그거 말고 피자'); /// 금칙어가 있습니다.

 

이유는 첫번째 줄에서는 indexOf( )로 가져온 치킨의 인덱스가 0 이기 때문에

if(0)은 false여서 else에 있는 통과라는 문구를 반환하고

 

세번째 줄은 원래 문자열에 없는 문자들이기 때문에 -1을 반환하는데 if(-1)은 true이기 때문에

if 문 아래의 console.log( )를 반환해준다.

 

 

때문에 위에서 언급했었던 것처럼 -1보다 클 때로 비교하면 의도대로 결과가 나타난다.

function eatChicken(str) {
  if(str.indexOf('치킨') > -1) {
    console.log('금칙어가 있습니다.');
  } else {
    console.log('통과~!!');
  }
}

eatChicken('치킨 먹고싶다 !!!');  //  금칙어가 있습니다.
eatChicken('오 나도 치킨 먹고싶다!');  // 금칙어가 있습니다.
eatChicken('아.. 나는 그거 말고 피자'); // 통과~!!

 

 

 

위의 함수는 includes로 사용하면 조금 더 간단하게 사용할 수 있다.

function eatChicken(str) {
  if(str.includes('치킨')) {
    console.log('금칙어가 있습니다.');
  } else {
    console.log('통과~!!');
  }
}

eatChicken('치킨 먹고싶다 !!!');  //  금칙어가 있습니다.
eatChicken('오 나도 치킨 먹고싶다!');  // 금칙어가 있습니다.
eatChicken('아.. 나는 그거 말고 피자'); // 통과~!!

 

 

 

 

 

 

 

 

 

 

 

 

* 본 포스팅은 코딩앙마님의 자바스크립트 중급 강좌를 기반으로 작성한 글입니다.