🌵 문제 상황
프로그래머스의 문제 중 'JadenCase 문자열 만들기'에서 문자열 중 원하는 문자만 대문자로 바꾸기 위해 '='을 이용하여
// 🚫틀린 코드입니다
string[i] = string[i].toUpperCase();
위와 같은 코드로 새로운 문자를 할당했지만, 문자가 제대로 변경되지 않았습니다.
그 이유는
자바스크립트의 원시값은 변경 불가능 = 불변하기 때문입니다.(전체값을 재할당은 가능)
따라서 원시값이란 무엇인지와 문자열의 특정 문자를 변경하는 방법에 대해 알아보겠습니다.
🌵 원시값(primitive, 원시 자료형)
객체가 아니면서 메서드 또는 속성도 가지지 않는 데이터로, 변수에 저장된 값에 직접적으로 접근할 수 있는 단순한 데이터입니다.
원시값의 종류에는 7가지가 있습니다.
- String(문자)
- Number(숫자)
- Boolean(참, 거짓)
- Null(빈 값)
- Undefined(정의되지 않은)
- BigInt
- Symbol
원시값의 가장 중요한 특징은 바로
이미 생성한 값 자체는 변형할 수 없다는 것입니다.
여기서 원시값을 할당한 '변수'와 vs 변수에 할당된 '원시값 자체'는 다르다는 것을 인지하고 있어야 합니다.
변수에는 새로운 값을 다시 할당할 수 있지만, 이미 생성한 원시값 자체는 객체나 배열과 달리 변형할 수 없습니다.
let number = 5;
number = 10; // 값을 변경한 게 아니라 '재할당'한 것
let str = 'Emma';
str[0] = 'e'; // 원시값은 불변이므로 이 코드는 동작하지 않음
console.log(str); // Emma
str = 'emma'; // 새로운 값을 재할당
console.log(str); // emma
위에서 제가 시도했던 방법처럼 원시값인 String에서 하나의 문자만 변경하는 것은 불가하지만,
전체 문자열을 재할당하는 것은 가능하다는 의미입니다.
원시 타입을 제외한 모든 타입인 참조 타입(참조값)에 대해 알고 싶다면 다음 블로그를 참고해주세요.
🌵 특정 문자를 변경하는 방법
방법 1) slice 메서드 사용하기
바꾸고 싶은 문자 직전까지 자른 문자열 + '원하는 문자' + 바꾸고 싶은 문자 다음부터 끝까지의 문자열
let str = "abcDefg";
const index = 3; // D의 인덱스 번호
const newLetter = "d"; // 바꾸고 싶은 문자
const result = str.slice(0, index) + newLetter + str.slice(index + 1);
console.log(result); // abcdefg
방법 2) substring 메서드 사용하기
slice 메서드와 동일한 방법으로 사용하면 됩니다.
바꾸고 싶은 문자 직전까지 자른 문자열 + '원하는 문자' + 바꾸고 싶은 문자 다음부터 끝까지의 문자열
let str = "abcDefg";
const index = 3; // D의 인덱스 번호
const newLetter = "d"; // 바꾸고 싶은 문자
const result = str.substring(0, index) + newLetter + str.substring(index + 1);
console.log(result); // abcdefg
방법 3) 문자열을 배열로 바꾸어 처리 후 -> 다시 문자열로 바꿔주기
let str = "abcDefg";
const index = 3; // D의 인덱스 번호
const newLetter = "d"; // 바꾸고 싶은 문자
let result = str.split("");
result[index] = newLetter;
result = result.join("");
console.log(result); // abcdefg
해당 블로그를 참고하였습니다.
처음에 해당 내용을 보고 굉장히 당황스러웠다..정말 기본적인 내용 같은데 내가 까먹은건가
이전까지 문자열도 배열인 C 계열 언어만 사용했어서 당연히 된다고 생각했나보다...
읽어주셔서 감사합니다:)