개요
파이썬의 swapcase() 메서드처럼 문자열의 대소문자를 한 번에 뒤집어 주는 기능은 JavaScript에 기본으로 제공되지 않습니다. 이번 글에서는 하나의 문자열을 입력받아, 원본 문자열의 모든 대문자는 소문자로, 모든 소문자는 대문자로 변환한 새로운 문자열을 만들어 반환하는 JavaScript 함수를 직접 작성해 보겠습니다.
예를 들어 다음과 같은 문자열이 있다고 가정해 보겠습니다.
const str = 'The Case OF tHis StrinG Will Be FLiPped';
기대 출력
함수 실행 후 기대되는 결과는 다음과 같습니다. 모든 알파벳 글자의 대소문자가 정확히 반전된 것을 확인할 수 있습니다.
const output = 'tHE cASE of ThIS sTRINg wILL bE flIpPED';
구현 아이디어
핵심은 아스키(ASCII) 코드를 활용하는 것입니다. 영어 대문자 A~Z의 아스키 코드 값은 65~90 범위에 있고, 소문자 a~z는 97~122 범위에 있습니다. 두 범위 사이의 차이는 정확히 32이므로, 소문자라면 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;
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: 각 문자의 첫 번째 아스키 코드 값을 확인해 해당 문자가 대문자(A~Z)인지 소문자(a~z)인지 판별하는 헬퍼 함수입니다.
- flipCase 함수: 문자열을 한 글자씩 순회하면서, 소문자면 32를 빼고 대문자면 32를 더한 새로운 문자를 만들어 결과 문자열에 이어 붙입니다.
- String.fromCharCode(): 계산된 아스키 코드 값을 다시 문자로 변환할 때 사용됩니다.
실행 결과
콘솔에 출력되는 최종 결과는 다음과 같습니다.
tHE cASE of ThIS sTRINg wILL bE flIpPED
이처럼 아스키 코드의 규칙적인 차이만 이해하면, 별도의 외부 라이브러리 없이도 문자열의 대소문자를 자유롭게 반전시키는 함수를 간단하게 구현할 수 있습니다.