이전 글에서
Java의 char 타입은 문자가 아니라 Unicode 숫자 값을 저장하며
그 결과 정수처럼 동작한다는 것을 확인했다.
이번 글에서는 그 특성을 이용해
대소문자를 어떻게 구분할 수 있는지를 살펴본다.
대소문자 구분은
문자열 처리와 코딩 테스트에서 매우 자주 사용되는 기본 패턴이다.
Java에서는 문자를 비교하는 코드는 자주 등장한다.
char c = 'm';
if (c >= 'a' && c <= 'z') {
System.out.println("소문자");
}
겉보기에는 문자를 비교하는 것처럼 보이지만,
실제로는 유니코드 숫자 값의 범위를 비교하는 연산이다.
따라서 위 조건문은 내부적으로 다음과 같이 처리된다.
// 'm' → 109
// 'a' → 97
// 'z' → 122
if (c >= 97 && c <= 122)
Java의 char 타입이 정수처럼 동작하기 때문에
이러한 범위 비교가 가능하다.
if (c >= 'A' && c <= 'Z') {
System.out.println("대문자");
}
이번에도 Java는
문자를 비교하는 것이 아니라
다음과 같은 숫자 비교를 수행한다.
'A' → 65
'Z' → 90
즉, 대소문자 구분은
문자의 모양이 아니라 숫자 범위를 기준으로 이루어진다.
대문자와 소문자는 Unicode(ASCII 포함)에서 서로 다른 연속된 숫자 범위로 배치되어 있다.
// 대문자
'A' → 65 ~ 'Z' → 90
// 소문자
'a' → 97 ~ 'z' → 122
그리고 이 두 범위 사이에는 항상 일정한 간격이 존재한다.
'a' - 'A' = 32
이 값 32는 모든 알파벳에서 동일하다.
즉, 대소문자 변환 시 'a' - 'A'라는 숫자 32를 가지고 산술연산이 사용된다.
이제 위에서 확인한 숫자 간격(32)을 이용해 실제 변환을 해보자.
char c = 'm';
// 소문자를 대문자로 변환
if (c >= 'a' && c <= 'z') {
c = (char) (c - ('a' - 'A')); // 32
}
System.out.println(c); // M
Java 내부에서는 이렇게 처리된다.
'm' // 109
'a' - 'A' // 32
109 - 32 → 77 → 'M'
char와 int를 연산하면 결과는 항상 int가 된다.
문자로 다시 사용하려면 (char)로 형 변환을 해야 한다.
char ch = 'm';
int temp = ch - 32; // 109 - 32 = 77 → int
char upper = (char) temp; // 77 → 'M'
Java는 대소문자 구분 및 변환을 위한 메서드도 제공한다.
char c = 'm';
// Character 클래스 사용
if (Character.isLowerCase(c)) {
System.out.println("소문자");
// 소문자를 대문자로 변환
char upper = Character.toUpperCase(c);
System.out.println("대문자 변환: " + upper);
} else if (Character.isUpperCase(c)) {
System.out.println("대문자");
// 대문자를 소문자로 변환
char lower = Character.toLowerCase(c);
System.out.println("소문자 변환: " + lower);
}
// cf). 주어진 문자가 숫자 문자인지 판별하는 메서드
char c1 = '7';
char c2 = 'a';
System.out.println(Character.isDigit(c1)); // true
System.out.println(Character.isDigit(c2)); // false
Character.isLowerCase(c) / Character.isUpperCase(c)
입력된 문자가 소문자인지 대문자인지를 자동으로 판별해준다.
Character.toUpperCase(c) / Character.toLowerCase(c)
소문자를 대문자로, 대문자를 소문자로 변환할 때 사용한다.
내부적으로는 'a' - 'A' = 32 같은 숫자 연산을 수행한다.
Character.isDigit(char c)
주어진 문자가 숫자 문자인지 판별하는 메서드이다.
반환값은 boolean (true / false)