JavaScript에서는 표준 데이터 타입의 프로토타입에 직접 함수를 추가하여 마치 내장 메서드처럼 활용할 수 있습니다. 라이브러리 메서드를 작성하는 것과 유사하지만, 이 경우에는 사용자 정의 타입이 아닌 원시(primitive) 데이터 타입에 기능을 확장한다는 점이 다릅니다.
여기서는 String 객체에 swapCase()라는 이름의 함수를 추가해 보겠습니다. 이 함수는 문자열 내의 모든 대문자를 소문자로, 소문자를 대문자로 바꾼 새로운 문자열을 반환합니다. 숫자, 특수문자, 공백 등 알파벳이 아닌 문자는 원본 그대로 유지됩니다.
동작 원리
구현 로직은 다음과 같습니다.
- 문자열을 한 글자씩 순회하면서
toLowerCase()와toUpperCase()의 결과가 서로 같은지 확인합니다. 같다면 해당 문자는 알파벳이 아니므로 그대로 추가합니다. - 문자가 이미 소문자라면 대문자로 변환하여 추가하고,
- 그렇지 않다면(즉, 대문자라면) 소문자로 변환하여 추가합니다.
예제
다음은 전체 구현 코드입니다 −
const str = 'ThIS iS A CraZY StRInG';
String.prototype.swapCase = function(){
let res = '';
for(let i = 0; i < this.length; i++){
if(this[i].toLowerCase() === this[i].toUpperCase()){
res += this[i];
continue;
};
if(this[i].toLowerCase() === this[i]){
res += this[i].toUpperCase();
continue;
};
res += this[i].toLowerCase();
};
return res;
};
console.log(str.swapCase());
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
tHis Is a cRAzy sTriNg
정규식을 활용한 간결한 대안
replace() 메서드와 정규식을 조합하면 더 짧은 코드로 동일한 기능을 구현할 수 있습니다.
String.prototype.swapCase = function(){
return this.replace(/[a-zA-Z]/g, ch =>
ch === ch.toLowerCase() ? ch.toUpperCase() : ch.toLowerCase()
);
};위 정규식은 영문 알파벳에 해당하는 문자만 변환하고 나머지는 그대로 두므로, 한글이나 숫자, 특수문자가 섞인 문자열에서도 안전하게 동작합니다.
주의 사항
내장 객체의 프로토타입을 수정하는 방식은 코드 재사용 측면에서 매우 편리하지만, 다른 라이브러리와의 충돌이나 향후 JavaScript 표준 업데이트와의 호환성 문제를 일으킬 수 있습니다. 따라서 실무 환경에서는 프로토타입 확장보다는 독립적인 유틸리티 함수 형태로 구현하는 것이 더 안전한 선택입니다.