HOWTO · JavaScript

JavaScript의 문자열에서 마지막 문자 제거

이 자습서에서는 JavaScript 문자열에서 마지막 문자를 제거하는 방법을 설명합니다.

이 페이지의 내용

JavaScript 문자열은 변경할 수 없으므로 문자를 제거해도 원본 문자열 자체는 바뀌지 않습니다. 선택한 부분이 빠진 새 문자열이 반환됩니다. 일반적인 경우에는 slice(0, -1)을 사용합니다. 음수 끝 인덱스는 문자열 끝에서부터 세므로, 결과에서 마지막 UTF-16 코드 단위가 제외됩니다. 여기서 ‘문자’가 사용자가 하나의 기호로 인식하는 단위를 뜻한다면, 기호 하나가 여러 코드 단위로 구성될 수 있으므로 아래의 유니코드 설명을 확인하세요.

다음 예제를 실행해 보세요:

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

const value = 'DelftStacks';
const shortened = value.slice(0, -1);
console.log(shortened);
DelftStack

예제에는 DelftStack이 표시됩니다. slice()에 시작 인덱스 0과 문자열 끝에서 한 코드 단위 앞을 가리키는 끝 인덱스를 전달하며, 원래 value는 바뀌지 않습니다.

slice()로 마지막 문자 제거하기

slice()에는 시작 인덱스와 선택적 끝 인덱스를 전달할 수 있습니다. 끝 인덱스는 결과에 포함되지 않으므로 해당 위치의 문자는 들어가지 않습니다. 음수 인덱스는 문자열 끝에서부터 계산합니다. 따라서 slice(0, -1)은 마지막 UTF-16 코드 단위 앞까지의 내용을 유지합니다. 이 동작이 필요한 경우 간결한 기본 방법입니다.

문자열은 변경할 수 없으므로 반환된 값을 나중에 사용하려면 변수에 할당하세요. 예를 들어 const shortened = value.slice(0, -1)처럼 작성합니다. let 변수에 결과를 다시 할당하지 않는 한 원래 변수는 계속 기존 문자열을 가리킵니다.

substring() 또는 substr()로 마지막 문자 제거하기

substring()에는 시작 인덱스와 결과에 포함되지 않는 끝 인덱스를 전달합니다. 마지막 코드 단위를 제외하려면 value.substring(0, value.length - 1)을 사용합니다. 인수를 하나만 전달하면 지정한 인덱스에서 시작해 문자열 끝까지 반환하므로, 그 자체로 마지막 문자를 제거하지는 않습니다.

레거시 substr() 메서드는 시작 인덱스와 길이를 인수로 받습니다. 예를 들어 value.substr(0, value.length - 1)은 마지막 코드 단위를 제외한 전체를 가져옵니다. 새 코드에서는 slice() 또는 substring()를 우선 사용하세요. substr()는 레거시 API이며, 길이를 받는 두 번째 인수를 끝 인덱스로 혼동하기 쉽습니다.

정규 표현식과 replace() 사용하기

replace()를 사용하면 value.replace(/.$/, '')로 마지막 문자를 제거할 수 있습니다. 이 패턴에서 $는 입력 끝에 일치하고, .은 기본적으로 줄 종결자가 아닌 문자 하나에 일치합니다. 대체 문자열은 빈 문자열이므로 일치한 문자가 빠집니다. $는 마지막 줄 종결자 바로 앞에도 일치할 수 있습니다. 따라서 문자열이 줄 바꿈으로 끝나면 줄 바꿈 대신 그 앞의 문자가 제거될 수 있습니다. 마지막 코드 단위를 일관되게 제거해야 한다면 문자열 메서드를 사용하세요.

빈 문자열, 줄 바꿈, 유니코드 문자 처리하기

빈 문자열에 slice(0, -1) 또는 substring(0, value.length - 1)을 적용하면 빈 문자열이 반환됩니다. 오류가 발생하지 않습니다. 코드 단위가 하나뿐인 문자열도 결과는 빈 문자열입니다. 이 메서드들은 JavaScript 문자열의 인덱스와 length가 기준으로 삼는 UTF-16 코드 단위를 셉니다.

서로게이트 쌍으로 표현되는 이모지와 다른 기호에서는 이 차이가 중요합니다. 코드 단위 하나만 제거하면 기호 전체가 아니라 짝이 없는 서로게이트가 남을 수 있습니다. 유니코드 코드 포인트 하나를 제거하려면 Array.from(value).slice(0, -1).join('')을 사용하세요. 이 방법은 각 코드 포인트를 하나의 항목으로 다룹니다. 사용자가 하나의 문자로 인식하는 그래핌은 기본 문자와 결합 부호, 또는 여러 이모지가 결합된 시퀀스처럼 코드 포인트 여러 개로 이루어질 수 있습니다. 이런 경우에는 Intl.Segmenter로 그래핌을 분할한 다음 마지막 세그먼트를 제거하세요.

문자열 끝의 줄 바꿈은 slice(0, -1)로 제거됩니다. 마지막 코드 단위를 값에 관계없이 제거하기 때문입니다. 정규 표현식 /.$/은 기본적으로 점이 줄 종결자와 일치하지 않으므로 다르게 동작합니다. 마지막 코드 단위, 코드 포인트, 그래핌 중 무엇을 제거하려는지에 따라 방법을 선택하세요. 이들은 서로 다른 작업입니다.