자바(Java)로 알고리즘 문제를 풀거나 문자열을 다룰 때, 문자열 안의 글자를 하나씩 꺼내서 확인해야 하는 경우가 정말 많습니다. 아마 자바를 처음 배우셨다면 아래와 같은 코드가 가장 익숙하실 겁니다.
기존 방식 (charAt 사용)
String str = "hello";
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
System.out.println(c);
}
물론 이 코드도 훌륭하게 작동하지만, 매번 length()를 부르고 i 값을 관리하며 charAt(i)를 쓰는 과정이 조금 번거롭고 코드가 길어집니다.
하지만 자바에는 이 과정을 아주 우아하게 단 한 줄로 끝내버리는 마법 같은 문법이 있습니다.
향상된 방식 (toCharArray 사용)
String str = "hello";
for (char c : str.toCharArray()) {
System.out.println(c);
}
코드가 정말 깔끔해지지 않았나요? 오늘은 이 한 줄의 코드가 내부적으로 어떻게 작동하는지 두 단계로 쪼개서 아주 쉽게 파헤쳐 보겠습니다.
toCharArray()의 역할자바에서 String (문자열)은 단순한 글자의 나열이 아니라, 꽁꽁 포장된 거대한 객체(상자)입니다. 그래서 "상자 안에 있는 글자를 하나씩 차례대로 꺼내줘!"라는 명령을 곧바로 내릴 수가 없습니다.
이때 toCharArray() 메서드를 사용하면, 자바가 문자열 객체의 포장을 뜯어서 안에 들어있던 낱개 글자들을 새로운 문자 배열(char[])로 만들어 줍니다.
str = "hello"; (포장된 문자열 객체)str.toCharArray() 실행 ➔ ['h', 'e', 'l', 'l', 'o'] 라는 배열 탄생!이제 코드는 이렇게 변한 것과 같습니다.
for (char c : ['h', 'e', 'l', 'l', 'o'])
자바 5부터 도입된 이 문법은 "향상된 for문(Enhanced for loop)"이라고 부릅니다. 배열이나 리스트 같은 바구니 안의 내용물을 처음부터 끝까지 아주 편하게 꺼내줍니다.
작동 규칙:
for ( 담을_변수 : 털어낼_바구니(배열) )
- 자바가 오른쪽 배열에서 첫 번째 값인
'h'를 꺼냅니다.- 왼쪽의
char c변수에'h'를 쏙 집어넣고 블록({ }) 안의 코드를 실행합니다.- 코드가 끝나면 다시 올라와서 두 번째 값인
'e'를 꺼내c에 넣고 실행합니다.- 배열에 더 이상 꺼낼 글자가 없을 때까지 알아서 반복한 뒤 종료합니다.
우리가 저렇게 짧고 예쁘게 코드를 쓰면, 자바 컴파일러(번역기)가 컴퓨터가 알아들을 수 있도록 코드를 몰래 옛날 방식으로 풀어버립니다. 즉, 향상된 for문은 개발자를 편하게 해주는 Syntactic Sugar입니다.
실제 자바가 내부적으로 실행하는 코드:
char[] tempArray = str.toCharArray(); // 1. 배열을 하나 새로 만든다.
for (int i = 0; i < tempArray.length; i++) { // 2. 길이를 계산해서 0부터 끝까지 돈다.
char c = tempArray[i]; // 3. 인덱스 번호로 하나씩 꺼내서 변수에 담아준다.
System.out.println(c);
}
이 완벽해 보이는 코드에도 상황에 따라 장단점이 존재합니다.
장점
i 같은 인덱스 변수를 쓰지 않아서 코드가 훨씬 깔끔하고 읽기 좋습니다.ArrayIndexOutOfBoundsException 에러를 만날 일이 없습니다.단점 (주의할 점)
i)를 모름: 반복문을 돌다가 "지금이 몇 번째 글자지?"를 알아야 하는 로직이라면 사용할 수 없습니다. (이때는 기존의 기본 for문을 써야 합니다.)toCharArray()가 내부적으로 새로운 배열을 생성하기 때문에, 극한의 메모리 최적화가 필요한 환경에서는 주의해야 합니다. (하지만 일반적인 실무나 코딩 테스트에서는 무시해도 될 수준입니다!)