이번 글에서는 문자열 하나를 인수로 받아, 포함된 모든 알파벳의 대소문자를 서로 뒤바꾸어 새로운 문자열을 만들어 반환하는 JavaScript 함수를 작성해 보겠습니다.
문제 정의
입력 문자열에는 대문자와 소문자가 섞여 있을 수 있습니다. 함수는 원본 문자열을 기반으로 다음 조건을 만족하는 새 문자열을 생성해야 합니다.
- 모든 대문자는 소문자로 변환
- 모든 소문자는 대문자로 변환
- 공백이나 숫자 등 알파벳이 아닌 문자는 그대로 유지
예를 들어 'ThIs Is A STriNG'이 입력되면 'tHiS iS a stRIng'이 결과로 나와야 합니다.
구현 코드
다음은 위 요구 사항을 충족하는 전체 코드입니다 −
const str = 'ThIs Is A STriNG';
// 한 글자씩 판별하여 대소문자를 변환하는 헬퍼 함수
const findLetter = (char = '') => {
// 대소문자 구분이 없는 문자(숫자, 공백 등)는 그대로 반환
if (char.toLowerCase() === char.toUpperCase()) {
return char;
} else if (char.toLowerCase() === char) {
// 소문자라면 대문자로 변환
return char.toUpperCase();
} else {
// 대문자라면 소문자로 변환
return char.toLowerCase();
}
};
// 문자열 전체를 순회하며 각 글자를 변환하는 메인 함수
const swapCase = (str = '') => {
let res = '';
for (let i = 0; i < str.length; i++) {
res += findLetter(str[i]);
}
return res;
};
console.log(swapCase(str));
코드 동작 원리
핵심 아이디어는 toLowerCase()와 toUpperCase() 메서드의 성질을 활용하는 것입니다.
- 알파벳 여부 판별: 어떤 문자에 두 메서드를 적용한 결과가 서로 같다면(예: 공백, 숫자), 해당 문자는 대소문자 개념이 없으므로 그대로 반환합니다.
- 소문자 판별: 원본 문자와
toLowerCase()결과가 같다면 소문자이므로toUpperCase()로 변환합니다. - 대문자 처리: 위 조건에 해당하지 않으면 대문자이므로
toLowerCase()로 변환합니다.
swapCase 함수는 이 로직을 문자열의 각 문자에 반복 적용하고, 결과를 하나의 문자열로 합쳐 반환합니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
tHiS iS a stRIng
보너스: 한 줄짜리 간결한 버전
배열 메서드를 활용하면 같은 기능을 훨씬 짧게 표현할 수도 있습니다.
const swapCaseShort = str =>
[...str]
.map(c => c === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase())
.join('');
console.log(swapCaseShort(str)); // tHiS iS a stRIng
알파벳이 아닌 문자는 toLowerCase()를 적용해도 값이 변하지 않으므로, 별도의 분기 처리 없이도 안전하게 동작합니다. 상황에 따라 가독성 좋은 첫 번째 버전 또는 간결한 두 번째 버전을 선택해 사용하시면 됩니다.