32์ฅ String
ํ์ค ๋นํธ์ธ ๊ฐ์ฒด์ธ String์ ์์ ํ์ ์ธ ๋ฌธ์์ด์ ๋ค๋ฃฐ ๋ ์ ์ฉํ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
32.1 String ์์ฑ์ ํจ์
ํ์ค ๋นํธ์ธ ๊ฐ์ฒด์ธ String ๊ฐ์ฒด๋ ์์ฑ์ ํจ์ ๊ฐ์ฒด๋ค. ๋ฐ๋ผ์ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ์ฌ String ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค.
์ธ์๋ฅผ ์ ๋ฌํ์ง ์๊ณ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ๋ฉด ๋น ๋ฌธ์์ด์ ํ ๋นํ String ๋ํผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ธ์๋ฅผ ์ ๋ฌํ๊ณ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ๋ฉด ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ฌธ์์ด์ ํ ๋นํ String ๋ํผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
const strObj = new String();
console.log(strObj); // String {length: 0, [[PrimitiveValue]]: ""}
const strObj2 = new String('Han');
console.log(strObj2); // {0: "H", 1: "a", 2: "n", length: 3, [[PrimitiveValue]]: "Han"}
String ๋ํผ ๊ฐ์ฒด๋ ๋ฐฐ์ด๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก length ํ๋กํผํฐ์ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ด๋ ์ซ์ ํ์์ ๋ฌธ์์ด์ ํ๋กํผํฐ ํค๋ก, ๊ฐ ๋ฌธ์๋ฅผ ํ๋กํผํฐ ๊ฐ์ผ๋ก ๊ฐ๋ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ด๋ฉด์ ์ดํฐ๋ฌ๋ธ์ด๋ค. ๋ฐ๋ผ์ ๋ฐฐ์ด๊ณผ ์ ์ฌํ๊ฒ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๋ฌธ์์ ์ ๊ทผํ ์ ์๋ค.
๋จ, ๋ฌธ์์ด์ ์์ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
String ์์ฑ์ ํจ์์ ์ธ์๋ก ๋ฌธ์์ด์ด ์๋ ๊ฐ์ ์ ๋ฌํ๋ฉด ์ธ์๋ฅผ ๋ฌธ์์ด๋ก ๊ฐ์ ๋ณํํ ํ, [[StringData]] ๋ด๋ถ๋ณ์ฌ๋กฏ์ํ๋ ๋ฌธ์์ด์ ํ ๋นํ String ๋ํผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
let strObj = new String(123);
console.log(strObj)
//String {0: "1", 1: "2", 2: "3", length: 3, [[PrimitiveValue]]: "123" }
strObj = new String(null);
console.log(strObj);
//String {0: "n", 1: "u", 2: "l", 3: "l", length: 4, [[PrimitiveValue]]: "null"}
new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ String ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ฌธ์์ด์ ๋ฐํํ๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ ๋ช ์์ ์ผ๋ก ํ์ ์ ๋ณํํ๊ธฐ๋ ํ๋ค.
String(1) // "1"
String(NaN) // "NaN"
String(Infinity) // "Infinity"
String(true) // "true"
String(false) // "false"
32.1 length ํ๋กํผํฐ
length ํ๋กํผํฐ๋ ๋ฌธ์์ด์ ๋ฌธ์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค.
'Hello'.length // 5
'hi'.length // 2
String ๋ํผ ๊ฐ์ฒด๋ ๋ฐฐ์ด๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก length ํ๋กํผํฐ๋ฅผ ๊ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ด๋ ์ซ์๋ฅผ ํ๋กํผํฐ ํค๋ก, ๊ฐ ๋ฌธ์๋ฅผ ํ๋กํผํฐ ๊ฐ์ผ๋ก ๊ฐ์ง๋ฏ๋ก String ๋ํผ ๊ฐ์ฒด๋ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด๋ค.
32.3 String ๋ฉ์๋
String ๊ฐ์ฒด์๋ ์๋ณธ String ๋ํผ ๊ฐ์ฒด๋ฅผ ์ง์ ๋ณ๊ฒฝํ๋ ๋ฉ์๋๊ฐ ์กด์ฌํ์ง ์๋๋ค. ๊ทธ๋์ String ๊ฐ์ฒด์ ๋ฉ์๋๋ ์ธ์ ๋ ์๋ก์ด ๋ฌธ์์ด์ ๋ฐํํ๋ค. ๋ฌธ์์ด์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ(immutable)ํ ์์ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ String ๋ํผ ๊ฐ์ฒด๋ ์ฝ๊ธฐ ์ ์ฉ ๊ฐ์ฒด(read only)๋ก ์ ๊ณต๋๋ค.
๋ง์ฝ String ๋ํผ ๊ฐ์ฒด๊ฐ ์ฝ๊ธฐ ์ ์ฉ ๊ฐ์ฒด๊ฐ ์๋๋ฉด, ๋ณ๊ฒฝ๋ String ๋ํผ ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ๋๋๋ฆด ๋ ๋ฌธ์์ด์ด ๋ณ๊ฒฝ๋๋ค. ๋ฐ๋ผ์ String ๊ฐ์ฒด์ ๋ชจ๋ ๋ฉ์๋๋ String ๋ํผ ๊ฐ์ฒด๋ฅผ ์ง์ ๋ณ๊ฒฝํ ์ ์๊ณ , String ๋ํผ ๊ฐ์ฒด์ ๋ฉ์๋๋ ์ธ์ ๋ ์๋ก์ด ๋ฌธ์์ด์ ์์ฑํ์ฌ ๋ฐํํ๋ค.
32.3.1 String.prototype.indexOf
indexOf ๋ฉ์๋๋ ๋์ ๋ฌธ์์ด์์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ฌธ์์ด์ ๊ฒ์ํด ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ค. ๊ฒ์์ ์คํจํ๋ฉด -1์ ๋ฐํํ๋ค.
const str = "hello world"
str.indexOf("l") // 2
str.indexOf("or") // 7
str.indexOf("x") // -1 => ๊ฒ์ ์คํจ์ -1 ์ ๋ฐํํ๋ค.
str.indexOf("l", 3) // 3 => 2๋ฒ์งธ ์ธ์๋ก ๊ฒ์์ ์์ํ ์ธ๋ฑ์ค๋ฅผ ์ ๋ฌํ ์ ์๋ค.
indexOf ๋ฉ์๋๋ ๋์ ๋ฌธ์์ด์ ํน์ ๋ฌธ์์ด์ด ์กด์ฌํ๋์ง ํ์ธํ ๋ ์ ์ฉํ๋ค.
ES6์์ ๋์ ๋ String.prototype.includes ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ ์ฑ์ด ๋ ์ข๋ค.
32.3.2 String.prototype.search
๋์ ๋ฌธ์์ด์์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ ๊ท ํํ์๊ณผ ๋งค์นํ๋ ๋ฌธ์์ด์ ๊ฒ์ํด ์ผ์นํ๋ ๋ฌธ์์ด์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ค. ๊ฒ์์ ์คํจํ๋ฉด -1์ ๋ฐํํ๋ค.
const str = 'hello world'
str.search(/o/) // 4
str.search(/x/) // -1
32.3.3 String.prototype.includes
ES6์์ ๋์ ๋ includes ๋ฉ์๋๋ ๋์ ๋ฌธ์์ด์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ฌธ์์ด์ด ํฌํจ๋์ด ์๋์ง ํ์ธํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ true ๋๋ false ๋ก ๋ฐํํ๋ค. 2๋ฒ์งธ ์ธ์๋ก ๊ฒ์ ์์ ์ธ๋ฑ์ค๋ฅผ ์ ๋ฌํ ์ ์๋ค.
const str = 'hello world'
str.includes('hello') // true
str.includes('wor') // true
str.includes('x') // false
str.includes() // false
// 2๋ฒ์งธ ์ธ์๋ก ๊ฒ์ ์์ ์ธ๋ฑ์ค๋ฅผ ์ ๋ฌํ ์ ์๋ค.
str.includes('l', 3) // true
str.includes('h', 3) // false
32.3.4 String.prototype.startsWith
ES6์์ ๋์ ๋ startsWith ๋ฉ์๋๋ ๋์ ๋ฌธ์์ด์ด ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ฌธ์์ด๋ก ์์ํ๋์ง ํ์ธํ์ฌ true ๋๋ false๋ฅผ ๋ฐํํ๋ค. 2๋ฒ์งธ ์ธ์๋ก ๊ฒ์ ์์ ์ธ๋ฑ์ค๋ฅผ ์ ๋ฌํ ์ ์๋ค.
const str = 'hello world'
str.startsWith("he") // true
str.startsWith('x') // false
str.startsWith(' ', 5) // true
32.3.5 String.prototype.endsWith
ES6์์ ๋์ ๋ endsWith ๋ฉ์๋๋ ๋์ ๋ฌธ์์ด์ด ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ฌธ์์ด๋ก ๋๋๋์ง ํ์ธํ์ฌ true ๋๋ false๋ฅผ ๋ฐํํ๋ค. 2๋ฒ์งธ ์ธ์๋ก ๊ฒ์ํ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ์ ๋ฌํ ์ ์๋ค.
const str = 'hello world'
str.endsWith("d") // true
str.endsWith("ld") // true
str.endsWith('lo', 5) // true
32.3.6 String.prototype.charAt
๋์ ๋ฌธ์์ด์์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ธ๋ฑ์ค์ ์์นํ ๋ฌธ์๋ฅผ ๊ฒ์ํ์ฌ ๋ฐํํ๋ค. ์ธ๋ฑ์ค๋ ๋ฌธ์์ด์ ๋ฒ์ (0 ~ ๋ฌธ์์ด ๊ธธ์ด-1) ์ฌ์ด์ ์ ์์ฌ์ผ ํ๋ค. ์ธ๋ฑ์ค๊ฐ ๋ฌธ์์ด์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ ์์ธ ๊ฒฝ์ฐ ๋น ๋ฌธ์์ด์ ๋ฐํํ๋ค.
const str = 'hello world'
for(let i = 0; i < str.length; i++){
console.log(str.charAt(i)) // h e l l o w o r l d
}
32.3.7 String.prototype.substring
๋์ ๋ฌธ์์ด์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ธ๋ฑ์ค์ ์์นํ ๋ฌธ์๋ถํฐ ๋ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ธ๋ฑ์ค์ ์์นํ ๋ฌธ์์ ๋ฐ๋ก ์ด์ ๋ฌธ์๊น์ง ๋ถ๋ถ ๋ฌธ์์ด์ ๋ฐํํ๋ค. ๋ ๋ฒ์งธ ์ธ์๋ ์๋ต ๊ฐ๋ฅํ๋ฉฐ, ์ด๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ถํฐ ๋ง์ง๋ง ๋ฌธ์๊น์ง ๋ถ๋ถ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
const str = 'hello world'
str.substring(1,4) // "ell"
str.substring(1) // "ello World"
// ์ฒซ ๋ฒ์งธ ์ธ์๋ ๋ ๋ฒ์งธ ์ธ์๋ณด๋ค ์์ ์ ์์ฌ์ผ ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ์ธ์๋ฅผ ์ ๋ฌํด๋ ์ ์๋์ํ๋ค.
str.substring(4, 1) // "ell" => ์ฒซ ๋ฒ์งธ ์ธ์ > ๋ ๋ฒ์งธ ์ธ์์ธ ๊ฒฝ์ฐ ๋ ์ธ์๋ ๊ตํ๋๋ค.
str.substring(-2) // "hello world" => ์ธ์ < 0 or NaN ์ธ ๊ฒฝ์ฐ 0์ผ๋ก ์ทจ๊ธ๋๋ค.
str.substring(1, 100) // "ello World" => ์ธ์ > str.length ์ธ ๊ฒฝ์ฐ ๋ฌธ์์ด์ ๊ธธ์ด๋ก ์ทจ๊ธ๋๋ค.
str.substring(20) // ""
indexOf ๋ฉ์๋์ ํจ๊ป ์ฌ์ฉํ๋ฉด ํน์ ๋ฌธ์์ด์ ๊ธฐ์ค์ผ๋ก ์๋ค์ ์์นํ ๋ถ๋ถ ๋ฌธ์์ด์ ์ทจํ ์ ์๋ค.
const str = 'hello world'
str.substring(0, str.indexOf(" ")) // "hello"
str.substring(str.indexOf(" ") + 1, str.length) // "world"
32.3.8 String.prototype.slice
substring ๋ฉ์๋์ ๋์ผํ๊ฒ ์๋ํ๋ค. ๋จ, slice ๋ฉ์๋์๋ ์์์ธ ์ธ์๋ฅผ ์ ๋ฌํด ๋ค์์๋ถํฐ ๋ฌธ์์ด์ ์๋ฅผ ์ ์๋ค.
const str = 'hello world'
str.slice(0, 5) // hello
str.slice(-5) //world
32.3.9 String.prototype.toUpperCase
๋์ ๋ฌธ์์ด์ ๋ชจ๋ ๋๋ฌธ์๋ก ๋ณ๊ฒฝํ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
const str = 'HEllo world'
str.toUpperCase() // HELLO WORLD
32.3.10 String.prototype.toLowerCase
๋์ ๋ฌธ์์ด์ ๋ชจ๋ ์๋ฌธ์๋ก ๋ณ๊ฒฝํ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
const str = 'HEllo world'
str.toLowerCase() // hello world
32.3.11 String.prototype.trim
๋์ ๋ฌธ์์ด ์ ๋ค ๊ณต๋ฐฑ ๋ฌธ์๋ฅผ ์ ๊ฑฐํ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
const str = " ahah "
str.trim() // 'ahah'
trimStart, trimEnd ๋ฅผ ์ฌ์ฉํด ์ ๋ค ๊ณต๋ฐฑ์ ์ ๊ฑฐํ ์ ์๋ค.
32.3.12 String.prototype.repeat
ES6์์ ๋์ ๋ repeat ๋ฉ์๋๋ ๋์ ๋ฌธ์์ด์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ ์๋งํผ ๋ฐ๋ณตํด ์ฐ๊ฒฐํ ์๋ก์ด ๋ฌธ์์ด์ ๋ฐํํ๋ค. ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ ์๊ฐ 0 ์ด๋ฉด ๋น ๋ฌธ์์ด์ ๋ฐํํ๊ณ , ์์์ด๋ฉด RangeError๋ฅผ ๋ฐ์์ํจ๋ค. ์ธ์๋ฅผ ์๋ตํ๋ฉด ๊ธฐ๋ณธ๊ฐ์ 0์ด๋ค.
const str = 'abc'
str.repeat() // ''
str.repeat(0) // ''
str.repeat(1) // 'abc'
str.repeat(5) // 'abcabcabcabcabc'
str.repeat(5.5) // 'abcabcabcabcabc' 2.5 => 2
str.repeat(-1) // RangeError: Invalid count value
32.3.13 String.prototype.replace
๋์ ๋ฌธ์์ด์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ฌธ์์ด ๋๋ ์ ๊ทํํ์์ ๊ฒ์ํด ๋ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ ๋ฌธ์์ด๋ก ์นํํ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
const str = 'hello world'
str.replace('world', 'Lee') // 'hello Lee'
// ๊ฒ์๋ ๋ฌธ์์ด์ด ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ, ์ฒซ ๋ฒ์งธ ๊ฒ์๋ ๋ฌธ์์ด๋ง ์นํํ๋ค.
const str2 = 'hello world world'
str2.replace('world', 'Lee') // 'hello Lee world'
// ํน์ํ ๊ต์ฒด ํจํด
const str3 = 'hello world'
str3.replace('world', '<strong>$&</strong>') // $& = ๊ฒ์๋ ๋ฌธ์์ด
// ์ ๊ท ํํ์ ์ ๋ฌ ๊ฐ๋ฅ
const str4 = 'hello hello'
str4.replace(/hello/gi, 'Lee') // 'Lee Lee'
๋ ๋ฒ์งธ ์ธ์๋ก ์นํ ํจ์๋ฅผ ์ ๋ฌํ ์๋ ์๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ ๋ฌธ์์ด ๋๋ ์ ๊ท ํํ์์ ๋งค์นํ ๊ฒฐ๊ณผ๋ฅผ ๋ ๋ฒ์งธ ์ธ์์ธ ์นํ ํจ์์ ์ธ์๋ก ์ ๋ฌํ๋ฉด์ ํธ์ถํ๊ณ , ์นํ ํจ์๊ฐ ๋ฐํํ ๊ฒฐ๊ณผ์ ๋งค์น ๊ฒฐ๊ณผ๋ฅผ ์นํํ๋ค.
32.3.14 String.prototype.split
๋์ ๋ฌธ์์ด์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ ๋ฌธ์์ด ๋๋ ์ ๊ท ํํ์์ ๊ฒ์ํด ๋ฌธ์์ด์ ๊ตฌ๋ถํ ํ ๋ถ๋ฆฌ๋ ๊ฐ ๋ฌธ์์ด๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ ๋ฐํํ๋ค. ์ธ์๋ก ๋น ๋ฌธ์์ด์ ์ ๋ฌํ๋ฉด ๊ฐ ๋ฌธ์๋ฅผ ๋ชจ๋ ๋ถ๋ฆฌํ๊ณ , ์ธ์๋ฅผ ์๋ตํ๋ฉด ๋์ ๋ฌธ์์ด ์ ์ฒด๋ฅผ ๋จ์ผ ์์๋ก ํ๋ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
const str = 'How are you doing?'
str.split(' ') // [ 'How', 'are', 'you', 'doing?' ]
str.split(/\s/) // [ 'How', 'are', 'you', 'doing?' ]
str.split('') // [ 'H', 'o', 'w', ' ', 'a', 'r', 'e', ' ', 'y', 'o', 'u', ' ', 'd', 'o', 'i', 'n', 'g', '?' ]
str.split() // [ 'How are you doing?' ]
// ๋ ๋ฒ์งธ ์ธ์๋ก ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ์ง์ ํ ์ ์๋ค.
str.split(' ', 3) // [ 'How', 'are', 'you' ]
Last updated
Was this helpful?