[Java] 문자 연산 활용 - 대소문자 구분

seonwoo·2026년 2월 5일

Java

목록 보기
10/12

들어가며

문자(char)는 왜 정수처럼 동작할까?

이전 글에서
Java의 char 타입은 문자가 아니라 Unicode 숫자 값을 저장하며
그 결과 정수처럼 동작한다는 것을 확인했다.

이번 글에서는 그 특성을 이용해
대소문자를 어떻게 구분할 수 있는지를 살펴본다.

대소문자 구분은
문자열 처리와 코딩 테스트에서 매우 자주 사용되는 기본 패턴이다.




1. 대소문자 구분의 기본 원리

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 타입이 정수처럼 동작하기 때문에
이러한 범위 비교가 가능하다.




2. 대문자 구분으로 확장하기


if (c >= 'A' && c <= 'Z') {
    System.out.println("대문자");
}

이번에도 Java는
문자를 비교하는 것이 아니라
다음과 같은 숫자 비교를 수행한다.

'A'65

'Z'90

즉, 대소문자 구분은
문자의 모양이 아니라 숫자 범위를 기준으로 이루어진다.




3. 대소문자가 구분될 수 있는 이유

대문자와 소문자는 Unicode(ASCII 포함)에서 서로 다른 연속된 숫자 범위로 배치되어 있다.

// 대문자
'A'65  ~  'Z'90

// 소문자
'a'97  ~  'z'122

그리고 이 두 범위 사이에는 항상 일정한 간격이 존재한다.

'a' - 'A' = 32

이 값 32는 모든 알파벳에서 동일하다.
즉, 대소문자 변환 시 'a' - 'A'라는 숫자 32를 가지고 산술연산이 사용된다.

4. 대소문자 변환 예제와 타입 캐스팅

이제 위에서 확인한 숫자 간격(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 - 3277'M'

4-1. 타입 캐스팅 필요성

charint를 연산하면 결과는 항상 int가 된다.

문자로 다시 사용하려면 (char)로 형 변환을 해야 한다.

char ch = 'm';
int temp = ch - 32;        // 109 - 32 = 77 → int
char upper = (char) temp;  // 77 → 'M'

5. Character - 문자 관련 유틸리티 클래스

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)



profile
Github : https://github.com/melly8954

0개의 댓글