| 문제 | 난이도 | 핵심 |
|---|---|---|
| 시저 암호 | Lv.1 | 대소문자 변환 응용 |
| 같은 숫자는 싫어 | Lv.1 | 문자열 처리 기초 |
| 문자열 내 마음대로 정렬하기 | Lv.1 | 대소문자 무시 정렬 |
toUpperCase()와 toLowerCase()는 문자열의 모든 알파벳을 대문자 또는 소문자로 변환하는 메서드다.
String s = "Hello World";
System.out.println(s.toUpperCase()); // HELLO WORLD
System.out.println(s.toLowerCase()); // hello world
알파벳이 아닌 문자(숫자, 공백, 특수문자)는 그대로 유지된다.
toUpperCase() — "Hello" 변환
| 문자 | ASCII (원본) | 변환 결과 | ASCII (변환) |
|---|---|---|---|
| H | 72 (이미 대문자) | H | 72 |
| e | 101 | E | 69 |
| l | 108 | L | 76 |
| l | 108 | L | 76 |
| o | 111 | O | 79 |
소문자와 대문자의 ASCII 차이는 항상 32다. toLowerCase()는 반대로 32를 더한다.
알고리즘 문제에서 가장 자주 쓰이는 패턴이다.
String a = "Hello";
String b = "hElLo";
// ❌ 틀린 방법
a.equals(b); // false — 대소문자 구분
// ✅ 올바른 방법 1
a.equalsIgnoreCase(b); // true
// ✅ 올바른 방법 2
a.toLowerCase().equals(b.toLowerCase()); // true
Character 클래스를 활용하면 문자 하나씩 변환할 수 있다.
char c = 'a';
Character.toUpperCase(c); // 'A'
Character.toLowerCase(c); // 'a'
// 대소문자 판별
Character.isUpperCase(c); // false
Character.isLowerCase(c); // true
Java의 String은 불변(Immutable) 이기 때문에 반환값을 반드시 받아야 한다.
String s = "hello";
s.toUpperCase(); // ❌ 아무 효과 없음 — 반환값을 버림
s = s.toUpperCase(); // ✅ 올바른 사용
일부 언어(예: 터키어)는 i → I 변환이 다르게 동작한다. 알고리즘 문제에선 대부분 영어만 다루므로 무시해도 되지만, 실무에서는 toUpperCase(Locale.ROOT)를 쓰는 것이 안전하다.
// 알고리즘 문제용 (영어만 다룰 때)
s.toUpperCase();
// 실무용 (언어 독립적)
s.toUpperCase(Locale.ROOT);
| 메서드 | 시간복잡도 | 비고 |
|---|---|---|
toUpperCase() | O(N) | 문자열 전체 순회 |
toLowerCase() | O(N) | 문자열 전체 순회 |
equalsIgnoreCase() | O(N) | 내부적으로 toLowerCase 후 비교 |
Character.toUpperCase() | O(1) | 문자 1개만 처리 |
s.toUpperCase()만 호출하고 결과를 버리는 실수가 잦다.a.toLowerCase()와 b를 비교하면 b에 대문자가 섞여 있을 때 틀린다. 둘 다 변환하거나 equalsIgnoreCase()를 써라."abc123".toUpperCase()는 "ABC123"이 된다.char 배열 처리 시 Character 클래스를 활용해라. 'a' - 32처럼 ASCII 연산으로 직접 변환하는 것도 가능하지만, 가독성이 떨어지고 실수하기 쉽다.