JavaScript의 문자열 메서드 중 하나인 toLowerCase()는 문자열 내 모든 대문자를 소문자로 변환해 줍니다. 이번 글에서는 이 기본 메서드를 직접 덮어쓰기(override)하면서 동일한 기능을 수행하는 사용자 정의 함수를 만들어 보겠습니다.
구현 원리
핵심 아이디어는 아스키(ASCII) 코드 값을 활용하는 것입니다. 영어 대문자 A~Z는 아스키 코드 65~90에 해당하고, 소문자 a~z는 97~122에 해당합니다. 즉, 대문자와 소문자 사이에는 항상 32만큼의 차이가 존재합니다. 따라서 각 문자의 아스키 코드를 확인한 뒤, 대문자 범위(65~90)에 속하는 문자에 한해서만 코드 값에 32를 더해 소문자로 변환하고, 나머지 문자는 그대로 유지하면 됩니다.
예제 코드
const str = 'Some UpPerCAsE LeTTeRs!!!';
const toLowerCase = function(){
let str = '';
for(let i = 0; i < this.length; i++){
const ascii = this[i].charCodeAt();
if(ascii >= 65 && ascii <= 90){
str += String.fromCharCode(ascii + 32);
}else{
str += this[i];
};
};
return str;
};
String.prototype.toLowerCase = toLowerCase;
console.log(str.toLowerCase());코드 설명
- 함수 내부에서
this는 해당 메서드를 호출한 문자열 자신을 가리킵니다. charCodeAt()으로 각 문자의 아스키 코드 값을 얻습니다.- 코드 값이 65 이상 90 이하라면 대문자이므로,
String.fromCharCode(ascii + 32)를 통해 소문자로 변환합니다. - 그 외의 문자(소문자, 숫자, 특수문자 등)는 원본 그대로 결과 문자열에 추가합니다.
- 마지막으로
String.prototype.toLowerCase에 새 함수를 할당하여 기본 메서드를 덮어씁니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
some uppercase letters!!!
모든 대문자가 정상적으로 소문자로 변환된 것을 확인할 수 있습니다. 다만 실무 환경에서는 표준 내장 메서드를 덮어쓰는 방식은 코드 예측성을 떨어뜨릴 수 있으므로, 학습 목적이나 특수한 요구 사항이 있을 때만 활용하는 것이 좋습니다.