yamoo9 / likelion-FEQA

질문/답변 — 프론트엔드 스쿨, 멋사
29 stars 9 forks source link

[LAB-4] 문자열의 일부를 수정하려고 하는 건 왜 안되는걸까요? #277

Closed SeoMiYoung closed 1 year ago

SeoMiYoung commented 1 year ago

질문 작성자

서미영

문제 상황

let helloArr = "안뇽하세요";
console.log(helloArr[1]);  // '뇽'이 콘솔에 찍힘
helloArr[1] = "녕";

저는 코드를 짤 때, 위의 예시와 같이 문자열의 일부를 [index]로 접근해서 수정하려고 했습니다. 특정 인덱스의 문자를 콘솔에 찍어보거나, 읽어들이는 건 전혀 문제가 없었지만,

helloArr[1] = "녕"처럼, 수정을 하려고 하면 에러가 발생합니다.

저희 팀원분께서 이 부분을 타입스크립트로 작성을 해보니, String 형식의 인덱스 시그니처는 읽기만 허용됩니다.라는 에러메세지가 떴다고 합니다.

제가 다른 프로그래밍 언어들이랑 헷갈리는 거일수도 있는데... 분명 문자열을 인덱스로 수정하는게 자바스크립트에서도 가능했던걸로 기억하거든요? (제가 제대로 기억하는게 맞는지 모르겠습니다ㅠㅠ)

어쨌든 수정이 불가능해져서 저는 다음과 같은 방식으로 수정을 시도했습니다.

let helloArr = "안뇽하세요";
let newArr = `${helloArr[0]}녕${helloArr[2]}${helloArr[3]}${helloArr[4]}`;
console.log(newArr); // 안녕하세요

또는,

let helloArr = "안뇽하세요";
let middle = helloArr.substr(2); // "하세요"
let newArr = `${helloArr[0]}녕${middle}`;
console.log(newArr); // 안녕하세요

질문을 정리하자면,

답변해주시면 감사하겠습니다.

shoveller commented 1 year ago

안녕하세요 @SeoMiYoung 님~ 잘 지내고 계신가요?

질문1) 왜 문자열의 일부를 수정하는게 안되는걸까요?

타입스크립트에서는 문자열이 불변(바꿀 수 없음, immutable)이기 때문입니다. 타입스크립트는 자바스크립트의 확장에 불과한 주제에 이런게 좀 엄격합니다. 아마 예상하지 못한 버그를 만들어 낼 수 있다는 이유로 막지 않았으려나요..

질문2) 자바스크립트에서도 문자열의 일부를 수정하는게 불가한가요?

아닙니다. 자바스크립트에선 얼마든지 가능합니다. 하지만 자바스크립트도 내부적으로는 새로운 문자열을 만들어 반환한다고 알고 있습니다.

질문3) 제가 선택한 방식말고 문자열의 일부를 수정하는 다른 방법은 없을까요?

타입스크립트에서는 문자열이 불변(바꿀 수 없음, immutable)이므로 새로운 문자열을 만드는 방법으로 코드를 작성해야 합니다. 위에서 만드신 예제처럼요.

SeoMiYoung commented 1 year ago

ㅎㅎ 잘지내고 있습니다!! 강사님도 잘 계시나요~? 잘 계시면 좋겠네요!!!

근데 저는 타입스크립트를 쓰는게 아니였는데, 왜 인덱스로 특정 문자를 바꾸는 방식이 에러가 떴을까요??

shoveller commented 1 year ago

ㅎㅎ 잘지내고 있습니다!! 강사님도 잘 계시나요~? 잘 계시면 좋겠네요!!!

근데 저는 타입스크립트를 쓰는게 아니였는데, 왜 인덱스로 특정 문자를 바꾸는 방식이 에러가 떴을까요??

앗 그렇다면..? 파일 확장자가 .ts 라던가? vscode 사용중에 뭔가 발생했다고밖엔 생각할수가 없군요?! 참고로 vscode 는 타입스크립트 컴파일러를 내장하고 있습니다.

yamoo9 commented 1 year ago

JavaScript의 Primitives 타입은 모두 불변입니다.

String Literal은 불변 값이므로 변수에 할당된 이후 특정 인덱스의 값을 추출할 수는 있으나 수정할 수는 없고, 값을 변경한 후 변수에 재할당 하여 값 그 자체를 바꿀 수 있습니다.

변수에 할당된 문자열 일부를 수정해 재할당하는 방식으로 값을 변경하는 방법은 다양합니다. @SeoMiYoung 님께서 나열한 방법 외에도 String.prototype.replace 메서드를 사용해 특정 값을 대체하여 재할당 할 수 있습니다.

let helloArr = "안뇽하세요";
helloArr = helloArr.replace('뇽', '녕');

여행 중에 스마트폰으로 남기는 답변이라 자세히 못 풀어드렸으나, 질문에서 궁금한 점은 풀리셨을 거라 생각합니다. 😀

SeoMiYoung commented 1 year ago

오오 그렇군요!! 불변...오호...!! 여행중인데도 불구하고 답변해주셔서 너무너무 감사합니다!! 여행 재밌게 다녀오세용!!