자바스크립트 문자열 : 문자열 다루기, 문자열 검사, 형변환

들어가며

기초 알고리즘을 자바스크립트로 풀면서 알게 된 내용들을 정리해 보았습니다. 파이썬 문자열을 꽤 다루어 보았음에도 “자바스크립트 문자열”을 다뤄보니 여간 헷갈리는 게 아니네요….

문자열 다루는 것이나 형변환은 유사한 데 자료형 검사 부분이 파이썬과 많이 달라 유독 고생을 했던 것 같습니다

고생하면서 정리한 내용이지만 문자열의 모든 부분을 커버하지는 못할 수 있어서 해당 부분은 차후 포스팅 하도록 하겠습니다.

자바스크립트 문자열 다루기

대소문자 변경

toUpperCase() 및 toLowerCase() 메소드를 사용하여 문자열의 대소문자를 변경할 수 있습니다.

let originalString = "Hello, World!";

// 대문자로 변환
let upperCaseString = originalString.toUpperCase();
console.log(upperCaseString);  // HELLO, WORLD!

// 소문자로 변환
let lowerCaseString = originalString.toLowerCase();
console.log(lowerCaseString);  // hello, world!

문자열 교체 : replace()

특정 하위 문자열을 다른 하위 문자열로 바꾸려면 replace() 메서드를 사용하세요.

let originalString = "Hello, World!";

// Replace 'Hello' with 'Hi'
let modifiedString = originalString.replace('Hello', 'Hi');
console.log(modifiedString);

모든 문자 항목을 전체적으로 바꾸려면 정규표현식에서 전역(g) 플래그를 사용해서 해결 할 수 있습니다.

정규표현식을 사용하기 위해서는 꽤나 많은 것을 정리해야 하기 때문에 이번 글에서는 간단한 예제만 가져왔습니다.

정규표현식을 사용해서 문자열 바꾸기

정규 표현식을 사용하지 않는다면 여러 문자열 중 맨 앞의 문자열만 교체를 하고 중단됩니다. 모든 문자열을 바꾸고 싶다면 정규표현식을 사용할 수 있습니다.

let originalString = "apple apple apple";
let modifiedString = originalString.replace("apple", "orange");

console.log(modifiedString);  // Output: "orange apple apple"

정규표현식을 사용하기 위해 /을 사용하고 전역 플래그인 ‘g’를 사용하면 아래와 같이 모든 문자열을 교체할 수 있습니다.

let originalString = "apple apple apple";
let modifiedString = originalString.replace(/apple/g, "orange");

console.log(modifiedString);  // Output: "orange orange orange"

전체 문자열 교체 : replaceAll()

물론 정규표현식을 사용하지 않고 문자열 전체에서 문자열 교체를 실시 할 수 있습니다.

ECMAScript 2021(ES12)부터 JavaScript는 문자열에 대한 replaceAll 메서드를 도입했습니다. 이 메서드는 정규식이 필요 없이 전역 교체를 단순화합니다.

let originalString = "apple apple apple";
let modifiedString = originalString.replaceAll("apple", "orange");

console.log(modifiedString);  // Output: "orange orange orange"

템플릿 리터럴 : ${}

템플릿 리터럴은 백틱(`)과 ${} 을 사용하여 변수를 넣을 수 있습니다.

let name = "John";
let age = 30;

// Using template literals
let formattedString = `Hello, my name is ${name} and I'm ${age} years old.`;

console.log(formattedString);
// Output: "Hello, my name is John and I'm 30 years old."

파이썬의 f-string과 다르게 작음 따옴표나 쌍 따옴표와 달리, 백틱 (`)을 사용해야만 템플릿 리터럴을 사용할 수 있음에 유의해야 합니다.

var = 'test'
string = f'{var} 앞에 아무거나 넣을 수 있음'

문자열 연결 : concat(), +

‘+’ 연산자나 concat() 메서드를 사용하여 문자열을 연결합니다.

let greeting = "Hello";
let name = "John";

// Concatenation using +
let message1 = greeting + ", " + name + "!";

// Concatenation using concat()
let message2 = greeting.concat(", ", name, "!");

하위 문자열 추출 : substring(), slice()

substring() 또는 slice()를 사용하여 문자열의 일부를 추출합니다.

let originalString = "Hello, World!";

// 인덱스 0부터 4까지
let substring1 = originalString.substring(0, 5);

// 인덱스 5부터 끝까지
let substring2 = originalString.substring(5);
//, World!

// 인덱스 0부터 4까지
let substring4 = originalString.slice(0, 5);
// World!

// 인덱스 5부터 끝까지
let substring4 = originalString.slice(5);
//, World!

공백 제거 : trim()

앞뒤 공백을 제거하려면 trim()을 사용하세요.

let stringWithWhitespace = "    Trim Me    ";
let trimmedString = stringWithWhitespace.trim();
console.log(trimmedString)  // Trim Me

앞 뒤 공백만 제거한다는 점에 유의 합니다.

파이썬의 경우 strip(), lstrip(), rstrip()으로 간단하게 원하는 쪽의 공백을 제거 할 수 있습니다.

반면 js에서는 replace() 함수와 정규표현식을 써야만 앞 뒤 공백을 제거할 수 있는 불편함이 존재합니다.

왼쪽 공백 제거

const str = "   Hello, World!   ";
const trimmedLeftStr = str.replace(/^\s+/, '');

console.log(trimmedLeftStr); // Output: "Hello, World!   "

^\s+는 문자열의 시작 부분(^)에 있는 하나 이상의 공백 문자(\s)와 일치하고 replace()는 이를 제거합니다.

오른쪽 공백 제거

const str = "   Hello, World!   ";
const trimmedRightStr = str.replace(/\s+$/, '');

console.log(trimmedRightStr); // Output: "   Hello, World!"

\s+$는 문자열 끝($)에 있는 하나 이상의 공백 문자(\s)와 일치하고 replace()는 이를 제거합니다.

문자열 포함 확인 : includes()

includes() 메서드는 호출 문자열에 지정된 하위 문자열이 포함되어 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

let mainString = "Hello, World!";
let subString = "World";

if (mainString.includes(subString)) {
  console.log("Substring is included in the main string.");
} else {
  console.log("Substring is not included in the main string.");
}

문자열 인덱스 확인 : indexOf()

indexOf() 메서드는 문자열에서 지정된 하위 문자열이 처음 나타나는 인덱스를 반환합니다.

하위 문자열을 찾을 수 없으면 -1을 반환함에 유의해야 합니다.

let mainString = "Hello, World!";
let subString = "World";

if (mainString.indexOf(subString) !== -1) {
  console.log("Substring is included in the main string.");
} else {
  console.log("Substring is not included in the main string.");
}

문자열 시작,끝 검사

문자열이 다른 문자열로 시작하거나 끝나는지 확인하려면 startsWith() 및 endsWith()를 사용할 수 있습니다.

const str = "Hello, World!";

// startsWith()를 사용하여 문자열이 "Hello"로 시작하는지 확인합니다.
const startsWithHello = str.startsWith("Hello");
console.log(startsWithHello); // true

// endsWith()를 사용하여 문자열이 "World!"로 끝나는지 확인합니다.
const endsWithWorld = str.endsWith("World!");
console.log(endsWithWorld); // true

이 예제에서 startsWith()는 문자열이 지정된 부분 문자열 “Hello”로 시작하는지 확인하고, endsWith()는 문자열이 지정된 부분 문자열 “World!”로 끝나는지 확인합니다.

두 함수 모두 조건이 충족되는지 여부를 나타내는 부울 값(true 또는 false)을 반환합니다.

문자열 자료형 검사

자료형 검사 : typeof()

typeof’ 연산자는 피연산자의 데이터 유형을 나타내는 문자열을 반환합니다. 일반적인 반환 값은 다음과 같습니다.

  • "undefined": 피연산자가 정의되지 않은 경우.
  • "boolean": 피연산자가 부울 값인 경우.
  • "number": 피연산자가 숫자인 경우.
  • "string": 피연산자가 문자열인 경우.
  • "symbol": 피연산자가 기호인 경우.
  • "object": 피연산자가 객체인 경우(null 제외).
  • "function": 피연산자가 함수인 경우.
typeof operand
typeof 42;                // "number"
typeof 42.3213            // "number"
typeof "42";              // "string"
typeof "hello";           // "string"
typeof true;              // "boolean"
typeof undefined;         // "undefined"
typeof null;              // "object" (historical quirk, null is not actually an object)
typeof {};                // "object"
typeof [];                // "object" (arrays are objects)
typeof function() {};     // "function"
typeof Symbol('example'); // "symbol"

"object"를 반환하는 typeof null은 JavaScript 역사의 특이한 현상이며 기술적으로 올바르지 않다는 점을 명심하세요. 또한 typeof는 다양한 유형의 객체(예: 배열, 객체, 함수)를 구별하지 않습니다.

NaN 검사1 : isNaN()

‘isNaN()’ 함수를 사용하여 값이 NaN(Not-a-Number)인지 여부를 확인합니다.

숫자가 아닌 문자열에 isNaN()을 사용할 때는 예상치 못한 결과가 발생할 수 있으므로 주의하세요.

엄격한 유형 검사를 수행하고 NaN인 ‘number’ 유형의 값에 대해서만 ‘true’를 반환하는 ES6에 도입된 ‘Number.isNaN()’과 같은 다른 메서드를 사용하는 것이 더 나은 경우가 많습니다.

// 숫자인 경우
isNaN(123);         // false
isNaN('123');       // false

// 문자인 경우
isNaN('hello');     // true

// 유의해야 하는 경우
isNaN('');          // false (can be converted to 0)
isNaN(null);        // false (treated as 0)
isNaN(true);        // false (converted to 1)
isNaN(undefined);   // true
isNaN(NaN);         // true

NaN 검사2 : Number.isNaN()

테스트하기 전에 숫자가 아닌 값을 숫자로 변환하지 않습니다.
값이 NaN인지 확인하는 데 isNaN()보다 선호됩니다.

Number.isNaN('abc');    // false (does not convert 'abc' to NaN)
Number.isNaN('123');    // false (does not convert '123' to 123)
Number.isNaN(123);      // false
Number.isNaN(NaN);      // true

Number.isFinite() 함수

값이 NaN 및 무한대를 제외한 유한수인지 확인합니다. 값이 유한한 숫자이면 ‘true’를 반환하고, 그렇지 않으면 ‘false’를 반환합니다.

Number.isFinite(value)

Number.isFinite() 함수는 부울 값을 반환합니다. 값이 유한수(NaN, Infinity 또는 -Infinity 아님)이면 ‘true’, 그렇지 않으면 ‘false’입니다.

Number.isFinite(42);        // true
Number.isFinite(-123.45);   // true
Number.isFinite(0);         // true
Number.isFinite(NaN);       // false
Number.isFinite(Infinity);  // false
Number.isFinite(-Infinity); // false
Number.isFinite('42');      // false (string representation of a number)
Number.isFinite(null);      // false (not a number)
Number.isFinite(undefined); // false (not a number)
Number.isFinite(true);      // false (not a number)
Number.isFinite({});        // false (not a number)
Number.isFinite([]);        // false (not a number)

문자열 자료형 변환

문자열 -> 숫자 형변환

단항 더하기 연산자(+) 사용

  • 단항 더하기 연산자는 피연산자를 숫자로 변환합니다.
let str = "42";
let num = +str;   // Convert string to number

parseInt() 및 parseFloat() 함수 사용

  • parseInt(): 문자열을 정수로 변환합니다.
  • parseFloat(): 문자열을 부동 소수점 숫자로 변환합니다.
let str = "42";
let num = parseInt(str);     // Convert string to integer
let floatNum = parseFloat("3.14");  // Convert string to float

Number() 생성자 사

  • Number() 생성자를 사용하여 문자열을 숫자로 변환할 수 있습니다
let str = "42";
let num = Number(str);  // Convert string to number

숫자 -> 문자열 형변환

toString() 메소드 사용합니다. 숫자를 문자열로 변환하려면 숫자 객체의 toString() 메서드를 사용하면 됩니다.

let num = 42;
let str = num.toString();   // Convert number to string

템플릿 리터럴을 사용할 수도 있습니다.

let num = 42;
let str = `${num}`;   // Convert number to string

문자열 -> 배열 형변환

split() 함수를 사용하면 됩니다. 인자를 기준으로 문자열을 쪼개서 배열에 넣어 줍니다.

캐릭터 단위로 쪼개서 배열로 넣고 싶으면 ”를 인자로 넣어 줍니다.

let str = "I am Groot!"
let arr = str.split('')
console.log(arr)  // ['I', ' ', 'a', 'm',' ', 'G', 'r', 'o','o', 't', '!']

파이썬과 달리 인자를 꼭 전달해야 함에 유의해야 합니다.

let str = "I am Groot!"
let arr = str.split()
console.log(arr)  // [ 'I am Groot!' ]

배열 -> 문자열 형변환

join() 함수를 사용하면 됩니다. 인자를 배열 요소 사이사이에 넣어주면서 문자열로 변환 합니다.

“”을 인자로 넣으면 배열 구성 그대로 문자열로 만들어 줍니다.

let arr = ["I", " ", "a", "m", " ", "G", "r", "o", "o", "t", "!"];
let str = arr.join("");
console.log(str); // I am Groot!

join()의 인자로 다른 값을 넣어주면 해당 값을 배열의 요소 사이사이에 넣어서 문자열로 만들어 줍니다.

let arr = ["I", " ", "a", "m", " ", "G", "r", "o", "o", "t", "!"];
let str = arr.join("+");
console.log(str); // I+ +a+m+ +G+r+o+o+t+!

파이썬과 달리 인자를 꼭 전달해야 함에 유의해야 합니다.

let arr = ["I", " ", "a", "m", " ", "G", "r", "o", "o", "t", "!"];
let str = arr.join();
console.log(str); // I, ,a,m, ,G,r,o,o,t,!

마치며

자바스크립트에서 공백을 제거하거나 문자열로 표현된 숫자를 파악하는 데(해당 포스트에서는 안 다룸)에 정규표현식이 꼭 들어갑니다.

정규표현식 속도 느리다고 해서 버릴려고 했는데… 자바스크립트에서 없으면 많이 불편 할 것 같습니다~!

자바스크립트에서는 정규표현식을 어떻게 사용하는지도 공부해봐야 겠습니다.

참고하면 좋은 글

Leave a Comment

목차