2-2 문자열

Nomade_Simia·2021년 11월 7일
0

📌이번에는 문자열에 대해 알아보자


우리는 흔히 문자열"문자의 배열"이라고 생각한다.
하지만 JS에서 문자열은 문자의 배열과 생심새만 비슷할 뿐 문자 배열과 같지 않다는 사실을 알아야 한다.

문자열은 배열과 겉모습이 닮았다. 다음을 보자.


💻 code

var a = "foo";
var b = ["f", "o", "o"];

a.length; // 3
b.length; //3

a.indexOf("o"); // 1
b.indexOf("o"); // 1

var c = a.concat("bar"); // "foobar"
var d = b.concat(["b", "a", "r"]); // ["f", "o", "o", "b", "a", "r"]

a === c; //false
b === d; //false

a; // "foo"
b; // ["f", "o", "o"]

문자열은 유사 배열이다.
따라서 둘 다 length, indexOf(), concat()과 같은 프로퍼티, 메서드를 사용할 수 있다.

그렇다면 둘 다 '문자의 배열'이라 말할 수 있나?


💻 code

a[1] = "O";
b[1] = "O";

a; // "foo"
b; // ["f", "O", "o"];

정답은 땡(❌) 이다.

문자열은 불변 값이지만 배열은 가변 값이다.
따라서 문자열은 불변 값이므로 문자열 메서드는 그 내용을 바로 변경하지 않고 항상 새로운 문자열을 생성 후 반환 한다.

반면 배열 메서드는 곧 바로 원소를 수정한다.


💻 code

c = a.toUpperCase();
a === c; // false
a; // "foo"
c; // "FOO"

b.push("!");
b;// ["f", "O", "o", "!"]

여기서 문자열을 다룰때 유용한 대부분의 배열 매서드는 문자열에 쓸 수 없지만, 문자열에 대해 불변 배열 메서드는 빌려쓸 수 있다.


💻 code

a.join; // undefined
a.map; // undefined

var c = Array.prototype.join.call(a, "-");
var d = Array.prototype.map.call(a, function(v){
  return v.toUpperCase() + ".";
}).join("");

c;// "f-o-o"
d;// "F.O.O"

다음은 문자열의 순서를 거꾸로 뒤집는 코드이다.
배열에는 reverse()라는 가변 메서드가 있지만. 문자열에는 없다....


💻 code

a.reverse; // undefined

b.reverse(); // ["!", "o", "O", "f"]
b; // ["!", "o", "O", "f"]

Array.prototype.reverse.call(a); // "foo"

아까 문자열을 뭐라고 했는가 그렇다 "불변 값"이다. 따라서 배열의 가변 메서드를 빌려 쓰는 것 또한 안된다.

여기서 꼼수(?)가 있는데 일단 문자열을 배열로 바꾼 뒤 가변 시킨후 다시 문자열로 바꾸는 것이다.


💻 code

 var c = a.split("") // a를 배열로 쪼갠다.
 		.reverce() // 쪼갠 배열을 뒤집는다.
 		.join(""); // 배열을 다시 문자열로 합친다.

💡 이때 복잡한(유니코드) 문자(특수 문자, 멀티바이트 문자)가 섞여 있는 경우 이 방법은 통하지 않는다. 제대로 처리하려면 정교한 라이브러리 유틸리티가 필요하다.

🚪 마치며


오늘은 JS가 문자열을 다루는 방법에 대해서 알아 보았다.

문자열은 우리가 숫자만큼 많이 처리하는 타입이다. 또한 알고리즘 문제를 풀때 문자열을 처리하는 문제는 많이 나온다!

JS로 알고리즘을 설계할 생각이라면 문자열을 처리하는 불변 메서드나 문자열을 배열로 전환하여 가변메서드로 처리하고 다시 문자열로 합치는 등 구사하는 방법을 고민해볼 필요가 있을 것 같다!!!🔥🔥🔥

profile
코딩 잘하고 싶은 코딩몽키

0개의 댓글