이번 글에서는 문자열을 입력받아 대문자는 소문자로, 소문자는 대문자로 변환한 새로운 문자열을 만들어 반환하는 JavaScript 함수를 작성해 보겠습니다.
핵심 원리
ASCII 코드 기준으로 영어 대문자 A~Z는 65~90, 소문자 a~z는 97~122 범위에 속합니다. 그리고 대문자와 소문자 사이의 코드 값 차이는 정확히 32입니다. 따라서 각 문자가 대문자인지 소문자인지 판별한 뒤, 이 차이(32)를 더하거나 빼주면 대소문자를 쉽게 뒤집을 수 있습니다.
예제 코드
다음은 위 원리를 구현한 전체 코드입니다.
const str = 'The Case OF tHis StrinG Will Be FLiPped';
const isUpperCase = char => char.charCodeAt(0) >= 65 && char.charCodeAt(0) <= 90;
const isLowerCase = char => char.charCodeAt(0) >= 97 && char.charCodeAt(0) <= 122;
const flipCase = str => {
let newStr = '';
const margin = 32; // 대문자와 소문자 간의 ASCII 코드 차이
for (let i = 0; i < str.length; i++) {
const curr = str[i];
if (isLowerCase(curr)) {
// 소문자 → 대문자로 변환
newStr += String.fromCharCode(curr.charCodeAt(0) - margin);
} else if (isUpperCase(curr)) {
// 대문자 → 소문자로 변환
newStr += String.fromCharCode(curr.charCodeAt(0) + margin);
} else {
// 알파벳이 아닌 문자는 그대로 유지
newStr += curr;
}
}
return newStr;
};
console.log(flipCase(str));코드 설명
- isUpperCase / isLowerCase: 문자의 첫 번째 문자 코드(charCodeAt(0))를 확인해 해당 문자가 대문자 또는 소문자 범위에 있는지 검사합니다.
- margin(=32): ASCII 표에서 대문자와 소문자 사이의 고정된 값 차이를 나타냅니다.
- String.fromCharCode(): 숫자 형태의 문자 코드를 다시 실제 문자로 변환하는 데 사용됩니다.
- 공백, 숫자, 특수문자 등 알파벳이 아닌 문자는 조건에 맞지 않으므로 원본 그대로 결과 문자열에 추가됩니다.
실행 결과
콘솔 출력 결과는 다음과 같습니다.
tHE cASE of ThIS sTRINg wILL bE flIpPED
참고: 더 간단한 방법
사실 JavaScript에는 내장 메서드를 활용하면 같은 기능을 한 줄로 처리할 수도 있습니다.
const flipCaseSimple = str =>
[...str].map(c => c === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase()).join('');
console.log(flipCaseSimple(str)); // tHE cASE of ThIS sTRINg wILL bE flIpPED내장 메서드 방식은 코드가 간결하고 가독성이 좋다는 장점이 있으며, ASCII 코드를 직접 다루는 방식은 문자 인코딩의 동작 원리를 이해하는 데 도움이 됩니다. 상황에 맞게 두 방식 중 하나를 선택해 활용하시면 됩니다.