ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

ํ‘œ์ค€ ๋นŒํŠธ์ธ ๊ฐ์ฒด์ธ String์€ ์›์‹œ ํƒ€์ž…์ธ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃฐ ๋•Œ ์œ ์šฉํ•œ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


String ์ƒ์„ฑ์ž ํ•จ์ˆ˜

String ๊ฐ์ฒด๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๊ฐ์ฒด๋ผ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜์—ฌ String ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. String ๋ž˜ํผ ๊ฐ์ฒด๋Š” ๋ฐฐ์—ด๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ length ํ”„๋กœํผํ‹ฐ์™€ ์ธ๋ฑ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž๋ฅผ ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ, ๊ฐ ๋ฌธ์ž๋ฅผ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋ฏ€๋กœ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

 

// 1. ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœ
const strObj = new String();
console.log(strObj); // String {length: 0, [[PrimitiveValue]]: ""}


// 2. ์ธ์ˆ˜๋กœ ๋ฌธ์ž์—ด ์ „๋‹ฌ
const strObj = new String('Lee');
console.log(strObj);
// String {0: "L", 1: "e", 2: "e", length: 3, [[PrimitiveValue]]: "Lee"}

console.log(strObj[0]); // L

// ๋ฌธ์ž์—ด์€ ์›์‹œ๊ฐ’์ด๋ฏ€๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋•Œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
strObj[0] = 'S';
console.log(strObj); // 'Lee'

// 3. ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฐ’์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ
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", : "l", length: 4, [[PrimitiveValue]]: "null"}

// 4. ๋ช…์‹œ์  ํƒ€์ž… ๋ณ€ํ™˜์— ์ด์šฉ
// ์ˆซ์ž ํƒ€์ž… => ๋ฌธ์ž์—ด ํƒ€์ž…
String(1);        // -> "1"
String(NaN);      // -> "NaN"
String(Infinity); // -> "Infinity"

// ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž… => ๋ฌธ์ž์—ด ํƒ€์ž…
String(true);  // -> "true"
String(false); // -> "false"
  • String ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜๋ฉด [[StringData]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์— ๋นˆ ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•œ String ๋ž˜ํผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
  • String ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์ธ์ˆ˜๋กœ ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ•˜๋ฉด์„œ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜๋ฉด [[StringData]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•œ String ๋ž˜ํผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
  • String ๋ž˜ํผ ๊ฐ์ฒด๋Š” ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋ฌธ์ž์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • String ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์ธ์ˆ˜๋กœ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ฉด ์ธ์ˆ˜๋ฅผ ๋ฌธ์ž์—ด๋กœ ๊ฐ•์ œ ๋ณ€ํ™˜ํ•œ ํ›„, [[StringData]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์— ๋ณ€ํ™˜๋œ ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•œ String ๋ž˜ํผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
  • new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  String ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž… ๋ณ€ํ™˜ ๊ฐ€๋Šฅ

length ํ”„๋กœํผํ‹ฐ

length ํ”„๋กœํผํ‹ฐ๋Š” ๋ฌธ์ž์—ด์˜ ๋ฌธ์ž ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

'Hello'.length;    // -> 5
'์•ˆ๋…•ํ•˜์„ธ์š”!'.length; // -> 6

String ๋ฉ”์„œ๋“œ

๋ฐฐ์—ด๊ณผ ๋‹ค๋ฅด๊ฒŒ String ๊ฐ์ฒด์—๋Š” ์›๋ณธ String ๋ž˜ํผ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๊ณ  ์–ธ์ œ๋‚˜ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ์›์‹œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— String ๋ž˜ํผ ๊ฐ์ฒด๋„ ์ฝ๊ธฐ ์ „์šฉ ๊ฐ์ฒด๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

 

const strObj = new String('Lee');

console.log(Object.getOwnPropertyDescriptors(strObj));
/* String ๋ž˜ํผ ๊ฐ์ฒด๋Š” ์ฝ๊ธฐ ์ „์šฉ ๊ฐ์ฒด๋‹ค. ์ฆ‰, writable ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์ด false๋‹ค.
{
  '0': { value: 'L', writable: false, enumerable: true, configurable: false },
  '1': { value: 'e', writable: false, enumerable: true, configurable: false },
  '2': { value: 'e', writable: false, enumerable: true, configurable: false },
  length: { value: 3, writable: false, enumerable: false, configurable: false }
}
*/

 

์‚ฌ์šฉ ๋นˆ๋„๊ฐ€ ๋†’์€ String ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

String.prototype.indexOf

indexOf ๋ฉ”์„œ๋“œ๋Š” ๋Œ€์ƒ ๋ฌธ์ž์—ด(๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋ฌธ์ž์—ด)์—์„œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฌธ์ž์—ด์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ฒ€์ƒ‰์— ์‹คํŒจํ•˜๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ 2 ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๊ฒ€์ƒ‰์„ ์‹œ์ž‘ํ•  ์ธ๋ฑ์Šค๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

// 1. ์ธ์ˆ˜ 1๊ฐœ ์ „๋‹ฌ
const str = 'Hello World';

// ๋ฌธ์ž์—ด str์—์„œ 'l'์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
str.indexOf('l'); // -> 2


// ๋ฌธ์ž์—ด str์—์„œ 'or'์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
str.indexOf('or'); // -> 7


// ๋ฌธ์ž์—ด str์—์„œ 'x'๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ฒ€์ƒ‰์— ์‹คํŒจํ•˜๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
str.indexOf('x'); // -> -1


// 2. ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๊ฒ€์ƒ‰์„ ์‹œ์ž‘ํ•  ์ธ๋ฑ์Šค๋ฅผ ์ „๋‹ฌ ๊ฐ€๋Šฅ
// ๋ฌธ์ž์—ด str์˜ ์ธ๋ฑ์Šค 3๋ถ€ํ„ฐ 'l'์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
str.indexOf('l', 3); // -> 3


// 3. ํŠน์ • ๋ฌธ์ž์—ด ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
if (str.indexOf('Hello') !== -1) {
  // ๋ฌธ์ž์—ด str์— 'Hello'๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ์ฒ˜๋ฆฌํ•  ๋‚ด์šฉ
}

if (str.includes('Hello')) {
  // ๋ฌธ์ž์—ด str์— 'Hello'๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ์ฒ˜๋ฆฌํ•  ๋‚ด์šฉ
}
  • ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฌธ์ž์—ด์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ฒ€์ƒ‰์— ์‹คํŒจํ•˜๋ฉด -1์„ ๋ฐ˜ํ™˜
  • ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๊ฒ€์ƒ‰์„ ์‹œ์ž‘ํ•  ์ธ๋ฑ์Šค ์ „๋‹ฌ ๊ฐ€๋Šฅ
  • ๋Œ€์ƒ ๋ฌธ์ž์—ด์— ํŠน์ • ๋ฌธ์ž์—ด์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•  ๋•Œ ์œ ์šฉํ•˜์ง€๋งŒ includes ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ€๋…์„ฑ์ด ๋” ์ข‹์Œ

 

String.prototype.search

search ๋ฉ”์„œ๋“œ๋Š” ๋Œ€์ƒ ๋ฌธ์ž์—ด์—์„œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ •๊ทœ ํ‘œํ˜„์‹๊ณผ ๋งค์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ฒ€์ƒ‰์— ์‹คํŒจํ•˜๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

const str = 'Hello world';

// ๋ฌธ์ž์—ด str์—์„œ ์ •๊ทœ ํ‘œํ˜„์‹๊ณผ ๋งค์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
str.search(/o/); // -> 4
str.search(/x/); // -> -1

 

String.prototype.includes

ES6์—์„œ ๋„์ž…๋œ includes ๋ฉ”์„œ๋“œ๋Š” ๋Œ€์ƒ ๋ฌธ์ž์—ด์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฌธ์ž์—ด์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ true ๋˜๋Š” false๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ 2 ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๊ฒ€์ƒ‰์„ ์‹œ์ž‘ํ•  ์ธ๋ฑ์Šค๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

const str = 'Hello world';

str.includes('Hello'); // -> true
str.includes('');      // -> true
str.includes('x');     // -> false
str.includes();        // -> false

// ๋ฌธ์ž์—ด str์˜ ์ธ๋ฑ์Šค 3๋ถ€ํ„ฐ 'l'์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ
str.includes('l', 3); // -> true
str.includes('H', 3); // -> false

 

String.prototype.startsWith

ES6์—์„œ ๋„์ž…๋œ startsWith ๋ฉ”์„œ๋“œ๋Š” ๋Œ€์ƒ ๋ฌธ์ž์—ด์ด ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฌธ์ž์—ด๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ true ๋˜๋Š” false๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ 2๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๊ฒ€์ƒ‰์„ ์‹œ์ž‘ํ•  ์ธ๋ฑ์Šค๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

const str = 'Hello world';

// ๋ฌธ์ž์—ด str์ด 'He'๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ
str.startsWith('He'); // -> true
// ๋ฌธ์ž์—ด str์ด 'x'๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ
str.startsWith('x'); // -> false

// ๋ฌธ์ž์—ด str์˜ ์ธ๋ฑ์Šค 5๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ' '๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ
str.startsWith(' ', 5); // -> true

 

String.prototype.endsWith

ES6์—์„œ ๋„์ž…๋œ endsWith๋ฉ”์„œ๋“œ๋Š” ๋Œ€์ƒ ๋ฌธ์ž์—ด์ด ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฌธ์ž์—ด๋กœ ๋๋‚˜๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ true ๋˜๋Š” false๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ 2๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๊ฒ€์ƒ‰์„ ์‹œ์ž‘ํ•  ์ธ๋ฑ์Šค๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

const str = 'Hello world';

// ๋ฌธ์ž์—ด str์ด 'ld'๋กœ ๋๋‚˜๋Š”์ง€ ํ™•์ธ
str.endsWith('ld'); // -> true
// ๋ฌธ์ž์—ด str์ด 'x'๋กœ ๋๋‚˜๋Š”์ง€ ํ™•์ธ
str.endsWith('x'); // -> false

// ๋ฌธ์ž์—ด str์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ 5์ž๋ฆฌ๊นŒ์ง€('Hello')๊ฐ€ 'lo'๋กœ ๋๋‚˜๋Š”์ง€ ํ™•์ธ
str.endsWith('lo', 5); // -> true

 

String.prototype.charAt

charAt ๋ฉ”์„œ๋“œ๋Š” ๋Œ€์ƒ ๋ฌธ์ž์—ด์—์„œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ธ๋ฑ์Šค์— ์œ„์น˜ํ•œ ๋ฌธ์ž๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๋Š” ๋ฌธ์ž์—ด ๋ฒ”์œ„(0~(๋ฌธ์ž์—ด๊ธธ์ด-1) ์‚ฌ์ด์˜ ์ •์ˆ˜)์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๊ฐ€ ๋ฌธ์ž์—ด์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ์ •์ˆ˜์ธ ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

const str = 'Hello';

for (let i = 0; i < str.length; i++) {
  console.log(str.charAt(i)); // H e l l o
}

// ์ธ๋ฑ์Šค๊ฐ€ ๋ฌธ์ž์—ด์˜ ๋ฒ”์œ„(0 ~ str.length-1)๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ ๋นˆ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
str.charAt(5); // -> ''

 

*charAt ๋ฉ”์„œ๋“œ์™€ ์œ ์‚ฌํ•œ ๋ฌธ์ž์—ด ๋ฉ”์„œ๋“œ๋Š” String.prototype.charCodeAt๊ณผ String.prototype.codePointAt์ด ์žˆ์Œ

 

String.prototype.substring

substring ๋ฉ”์„œ๋“œ๋Š” ๋Œ€์ƒ ๋ฌธ์ž์—ด์—์„œ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ธ๋ฑ์Šค์— ์œ„์น˜ํ•˜๋Š” ๋ฌธ์ž๋ถ€ํ„ฐ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ธ๋ฑ์Šค์— ์œ„์น˜ํ•˜๋Š” ๋ฌธ์ž์˜ ๋ฐ”๋กœ ์ด์ „ ๋ฌธ์ž๊นŒ์ง€์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

const str = 'Hello World';

// ์ธ๋ฑ์Šค 1๋ถ€ํ„ฐ ์ธ๋ฑ์Šค 4 ์ด์ „๊นŒ์ง€์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
str.substring(1, 4); // -> ell

 

 

substring ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • substring ๋ฉ”์„œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋ณด๋‹ค ์ž‘์€ ์ •์ˆ˜์ด์–ด์•ผ ์ •์ƒ
    • ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜ > ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์ธ ๊ฒฝ์šฐ ๋‘ ์ธ์ˆ˜๋Š” ๊ตํ™˜
    • ์ธ์ˆ˜ < 0 ๋˜๋Š” NaN์ธ ๊ฒฝ์šฐ 0์œผ๋กœ ์ทจ๊ธ‰
    • ์ธ์ˆ˜ > ๋ฌธ์ž์—ด์˜ ๊ธธ์ด์ธ ๊ฒฝ์šฐ ์ธ์ˆ˜๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋กœ ์ทจ๊ธ‰
  • indexOf ๋ฉ”์„œ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ๋ฌธ์ž์—ด์„ ๊ธฐ์ค€์œผ๋กœ ์•ž๋’ค์— ์œ„์น˜ํ•œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ์ทจ๋“ํ•  ์ˆ˜ ์žˆ์Œ
const str = 'Hello World'; // str.length == 11

// ์ธ๋ฑ์Šค 1๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๊นŒ์ง€ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
str.substring(1); // -> 'ello World'

// ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜ > ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์ธ ๊ฒฝ์šฐ ๋‘ ์ธ์ˆ˜๋Š” ๊ตํ™˜๋œ๋‹ค.
str.substring(4, 1); // -> 'ell'

// ์ธ์ˆ˜ < 0 ๋˜๋Š” NaN์ธ ๊ฒฝ์šฐ 0์œผ๋กœ ์ทจ๊ธ‰๋œ๋‹ค.
str.substring(-2); // -> 'Hello World'

// ์ธ์ˆ˜ > ๋ฌธ์ž์—ด์˜ ๊ธธ์ด(str.length)์ธ ๊ฒฝ์šฐ ์ธ์ˆ˜๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด(str.length)์œผ๋กœ ์ทจ๊ธ‰๋œ๋‹ค.
str.substring(1, 100); // -> 'ello World'
str.substring(20); // -> ''

// ์ŠคํŽ˜์ด์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•ž์— ์žˆ๋Š” ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ทจ๋“
str.substring(0, str.indexOf(' ')); // -> 'Hello'

// ์ŠคํŽ˜์ด์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋’ค์— ์žˆ๋Š” ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ทจ๋“
str.substring(str.indexOf(' ') + 1, str.length); // -> 'World'

 

String.prototype.slice

slice ๋ฉ”์„œ๋“œ๋Š” substring ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘๋ฉ๋‹ˆ๋‹ค. ๋‹จ, slice ๋ฉ”์„œ๋“œ๋Š” ์Œ์ˆ˜์ธ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ณ  ์Œ์ˆ˜์ธ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋Œ€์ƒ ๋ฌธ์ž์—ด์˜ ๊ฐ€์žฅ ๋’ค์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์ž˜๋ผ๋‚ด์–ด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

const str = 'hello world';

// substring๊ณผ slice ๋ฉ”์„œ๋“œ๋Š” ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.
// 0๋ฒˆ์งธ๋ถ€ํ„ฐ 5๋ฒˆ์งธ ์ด์ „ ๋ฌธ์ž๊นŒ์ง€ ์ž˜๋ผ๋‚ด์–ด ๋ฐ˜ํ™˜
str.substring(0, 5); // -> 'hello'
str.slice(0, 5); // -> 'hello'

// ์ธ๋ฑ์Šค๊ฐ€ 2์ธ ๋ฌธ์ž๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๊นŒ์ง€ ์ž˜๋ผ๋‚ด์–ด ๋ฐ˜ํ™˜
str.substring(2); // -> 'llo world'
str.slice(2); // -> 'llo world'

// ์ธ์ˆ˜ < 0 ๋˜๋Š” NaN์ธ ๊ฒฝ์šฐ 0์œผ๋กœ ์ทจ๊ธ‰๋œ๋‹ค.
str.substring(-5); // -> 'hello world'
// slice ๋ฉ”์„œ๋“œ๋Š” ์Œ์ˆ˜์ธ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋’ค์—์„œ 5์ž๋ฆฌ๋ฅผ ์ž˜๋ผ๋‚ด์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.
str.slice(-5); // โŸถ 'world'

 

String.prototype.toUpperCase

toUpperCase ๋ฉ”์„œ๋“œ๋Š” ๋Œ€์ƒ ๋ฌธ์ž์—ด์„ ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

const str = 'Hello World!';

str.toUpperCase(); // -> 'HELLO WORLD!'

 

String.prototype.toLowerCase

toLowerCase ๋ฉ”์„œ๋“œ๋Š” ๋Œ€์ƒ ๋ฌธ์ž์—ด์„ ๋ชจ๋‘ ์†Œ๋ฌธ์ž๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

const str = 'Hello World!';

str.toLowerCase(); // -> 'hello world!'

 

String.prototype.trim

trim ๋ฉ”์„œ๋“œ๋Š” ๋Œ€์ƒ ๋ฌธ์ž์—ด ์•ž๋’ค์— ๊ณต๋ฐฑ ๋ฌธ์ž๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์ด๋ฅผ ์ œ๊ฑฐํ•œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

// 1. trim
const str = '   foo  ';

str.trim(); // -> 'foo'


// 2. trimStart์™€ trimEnd ํ™œ์šฉ
const str = '   foo  ';

// String.prototype.{trimStart,trimEnd} : Proposal stage 4
str.trimStart(); // -> 'foo  '
str.trimEnd();   // -> '   foo'


// 3. replace ํ™œ์šฉ
const str = '   foo  ';

// ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ์ •๊ทœ ํ‘œํ˜„์‹์— ๋งค์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๋ฌธ์ž์—ด๋กœ ์น˜ํ™˜ํ•œ๋‹ค.
str.replace(/\s/g, '');   // -> 'foo'
str.replace(/^\s+/g, ''); // -> 'foo  '
str.replace(/\s+$/g, ''); // -> '   foo'
  • stage 4์— ์ œ์•ˆ๋˜์–ด ์žˆ๋Š” String.prototype.trimStart, String.prototype.trimEnd๋ฅผ ํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ
  • String.prototype.replace ๋ฉ”์„œ๋“œ์— ์ •๊ทœ ํ‘œํ˜„์‹์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜์—ฌ ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ์Œ

 

String.prototype.repeat

ES6์—์„œ ๋„์ž…๋œ repeat ๋ฉ”์„œ๋“œ๋Š” ๋Œ€์ƒ ๋ฌธ์ž์—ด์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ •์ˆ˜๋งŒํผ ๋ฐ˜๋ณตํ•ด ์—ฐ๊ฒฐํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ •์ˆ˜๊ฐ€ 0์ด๋ฉด ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์Œ์ˆ˜์ด๋ฉด RangeError์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ธ์ˆ˜๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’ 0์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

 

const str = 'abc';

str.repeat();    // -> ''
str.repeat(0);   // -> ''
str.repeat(1);   // -> 'abc'
str.repeat(2);   // -> 'abcabc'
str.repeat(2.5); // -> 'abcabc' (2.5 → 2)
str.repeat(-1);  // -> RangeError: Invalid count value

 

String.prototype.replace

replace ๋ฉ”์„œ๋“œ๋Š” ๋Œ€์ƒ ๋ฌธ์ž์—ด์—์„œ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฌธ์ž์—ด ๋˜๋Š” ์ •๊ทœํ‘œํ˜„์‹์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๋ฌธ์ž์—ด๋กœ ์น˜ํ™˜ํ•œ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

replace ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฒ€์ƒ‰๋œ ๋ฌธ์ž์—ด์ด ์—ฌ๋Ÿฟ ์กด์žฌํ•  ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ๋กœ ๊ฒ€์ƒ‰๋œ ๋ฌธ์ž์—ด๋งŒ ์น˜ํ™˜ํ•จ
  • ํŠน์ˆ˜ํ•œ ๊ต์ฒด ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • replace ๋ฉ”์„œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ •๊ทœ ํ‘œํ˜„์‹์„ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Œ
  • replace ๋ฉ”์„œ๋“œ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์น˜ํ™˜ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Œ
// 1. ์ผ๋ฐ˜์ ์ธ replace ์‚ฌ์šฉ
const str = 'Hello world';

// str์—์„œ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜ 'world'๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜ 'Lee'๋กœ ์น˜ํ™˜ํ•œ๋‹ค.
str.replace('world', 'Lee'); // -> 'Hello Lee'

const str = 'Hello world world';

str.replace('world', 'Lee'); // -> 'Hello Lee world'


// 2. ํŠน์ˆ˜ํ•œ ๊ต์ฒด ํŒจํ„ด
const str = 'Hello world';

// ($& => ๊ฒ€์ƒ‰๋œ ๋ฌธ์ž์—ด)
str.replace('world', '<strong>$&</strong>');

// 3. ์ •๊ทœ ํ‘œํ˜„์‹ ์‚ฌ์šฉ
const str = 'Hello Hello';

// 'hello'๋ฅผ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•˜์ง€ ์•Š๊ณ  ์ „์—ญ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
str.replace(/hello/gi, 'Lee'); // -> 'Lee Lee'


// 3. ์น˜ํ™˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ
// ์นด๋ฉœ ์ผ€์ด์Šค๋ฅผ ์Šค๋„ค์ดํฌ ์ผ€์ด์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
function camelToSnake(camelCase) {
  // /.[A-Z]/g๋Š” ์ž„์˜์˜ ํ•œ ๋ฌธ์ž์™€ ๋Œ€๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์— ๋งค์น˜ํ•œ๋‹ค.
  // ์น˜ํ™˜ ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ๋งค์น˜ ๊ฒฐ๊ณผ๊ฐ€ ์ „๋‹ฌ๋˜๊ณ , ์น˜ํ™˜ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๊ฒฐ๊ณผ์™€ ๋งค์น˜ ๊ฒฐ๊ณผ๋ฅผ ์น˜ํ™˜ํ•œ๋‹ค.
  return camelCase.replace(/.[A-Z]/g, match => {
    console.log(match); // 'oW'
    return match[0] + '_' + match[1].toLowerCase();
  });
}

const camelCase = 'helloWorld';
camelToSnake(camelCase); // -> 'hello_world'

// ์Šค๋„ค์ดํฌ ์ผ€์ด์Šค๋ฅผ ์นด๋ฉœ ์ผ€์ด์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
function snakeToCamel(snakeCase) {
  // /_[a-z]/g๋Š” _์™€ ์†Œ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์— ๋งค์น˜ํ•œ๋‹ค.
  // ์น˜ํ™˜ ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ๋งค์น˜ ๊ฒฐ๊ณผ๊ฐ€ ์ „๋‹ฌ๋˜๊ณ , ์น˜ํ™˜ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๊ฒฐ๊ณผ์™€ ๋งค์น˜ ๊ฒฐ๊ณผ๋ฅผ ์น˜ํ™˜ํ•œ๋‹ค.
  return snakeCase.replace(/_[a-z]]/g, match => {
    console.log(match); // '_w'
    return match[1].toUpperCase();
  });
}

const snakeCase = 'hello_world';
snakeToCamel(snakeCase); // -> 'helloWorld'

 

String.prototype.split

split ๋ฉ”์„œ๋“œ๋Š” ๋Œ€์ƒ ๋ฌธ์ž์—ด์—์„œ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๋ฌธ์ž์—ด ๋˜๋Š” ์ •๊ทœ ํ‘œํ˜„์‹์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ๊ตฌ๋ถ„ํ•œ ํ›„ ๋ถ„๋ฆฌ๋œ ๊ฐ ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

split ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ธ์ˆ˜๋กœ ๋นˆ ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ•˜๋ฉด ๊ฐ ๋ฌธ์ž๋ฅผ ๋ชจ๋‘ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
  • ์ธ์ˆ˜๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๋Œ€์ƒ ๋ฌธ์ž์—ด ์ „์ฒด๋ฅผ ๋‹จ์ผ ์š”์†Œ๋กœ ํ•˜๋Š” ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜
  • ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • Array.prototype.revers, Array.prototype.join ๋ฉ”์„œ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ž์—ด์„ ์—ญ์ˆœ์œผ๋กœ ๋’ค์ง‘์„ ์ˆ˜ ์žˆ์Œ
const str = 'How are you doing?';

// ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„(๋‹จ์–ด๋กœ ๊ตฌ๋ถ„)ํ•˜์—ฌ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
str.split(' '); // -> ["How", "are", "you", "doing?"]

// \s๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ณต๋ฐฑ ๋ฌธ์ž(์ŠคํŽ˜์ด์Šค, ํƒญ ๋“ฑ)๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, [\t\r\n\v\f]์™€ ๊ฐ™์€ ์˜๋ฏธ๋‹ค.
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?"]

// ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋‹จ, ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” 3์ด๋‹ค
str.split(' ', 3); // -> ["How", "are", "you"]

// ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฌธ์ž์—ด์„ ์—ญ์ˆœ์œผ๋กœ ๋’ค์ง‘๋Š”๋‹ค.
function reverseString(str) {
  return str.split('').reverse().join('');
}

reverseString('Hello world!'); // -> '!dlrow olleH'

[์ถœ์ฒ˜] ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive

https://wikibook.co.kr/mjs/

 

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ

269๊ฐœ์˜ ๊ทธ๋ฆผ๊ณผ ์›๋ฆฌ๋ฅผ ํŒŒํ—ค์น˜๋Š” ์„ค๋ช…์œผ๋กœ ‘์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ’๋ฅผ ์ดํ•ดํ•˜์ž! ์›นํŽ˜์ด์ง€์˜ ๋‹จ์ˆœํ•œ ๋ณด์กฐ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ œํ•œ์ ์ธ ์šฉ๋„๋กœ ํƒœ์–ด๋‚œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ณผ๋„

wikibook.co.kr