문제 소개
JavaScript에는 문자열을 대문자로 변환하는 내장 메서드인 String.prototype.toUpperCase()가 이미 존재합니다. 하지만 이번 글에서는 이 메서드를 사용하지 않고 동일한 기능을 직접 구현해 보겠습니다.
요구 사항은 다음과 같습니다.
- 작성할 함수는
String클래스의 프로토타입(prototype) 객체에 정의되어야 합니다. - 문자열에 포함된 모든 영문 알파벳을 대문자로 변경한 새로운 문자열을 반환해야 합니다.
구현 방법
핵심 아이디어는 매우 단순합니다. 먼저 소문자 알파벳 목록과 대문자 알파벳 목록을 각각 준비합니다. 그다음 원본 문자열을 한 글자씩 순회하면서 해당 문자가 소문자 목록에 있는지 확인하고, 존재한다면 동일한 위치(인덱스)의 대문자로 치환합니다. 공백이나 숫자, 특수문자처럼 소문자 목록에 없는 문자는 그대로 결과에 추가됩니다.
이 방식은 별도의 내장 변환 메서드 없이 문자열 순회와 인덱스 매핑만으로 대소문자 변환이 가능하다는 점에서 학습 가치가 큽니다.
코드 예제
다음은 전체 구현 코드입니다.
const str = 'This is a lowercase String';
String.prototype.customToUpperCase = function () {
const legend = 'abcdefghijklmnopqrstuvwxyz';
const UPPER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
let res = '';
for (let i = 0; i < this.length; i++) {
const el = this[i];
const index = legend.indexOf(el);
if (index !== -1) {
// 소문자인 경우 → 같은 인덱스의 대문자로 치환
res += UPPER[index];
} else {
// 소문자가 아니면 → 원래 문자 그대로 유지
res += el;
}
}
return res;
};
console.log(str.customToUpperCase());실행 결과
위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다.
THIS IS A LOWERCASE STRING
동작 원리 정리
legend문자열에서 현재 문자의 인덱스를 찾습니다.- 인덱스가
-1이 아니라면 해당 문자는 소문자이므로,UPPER에서 같은 인덱스의 대문자를 가져옵니다. - 인덱스가
-1이라면 소문자가 아니므로 원래 문자를 그대로 결과에 이어 붙입니다.
참고로 이 구현은 ASCII 영문 소문자(a~z)만 처리하며, 한글이나 악센트 문자 같은 유니코드 확장 문자의 대문자 변환까지는 지원하지 않습니다. 실무 환경에서는 검증된 내장 메서드 toUpperCase()를 사용하는 것이 안전하지만, 문자열 순회와 프로토타입 확장 개념을 익히기에는 훌륭한 예제입니다.