문자열을 거꾸로 뒤집는 것은 자바(Java) 기술 면접에서 가장 단골로 출제되는 질문 중 하나입니다. 면접관은 다양한 방식으로 문자열을 뒤집는 코드를 작성해 보라고 요구하거나, 내장 메서드 없이 직접 구현하라고 제시할 수도 있으며, 재귀 호출(recursion)을 이용한 풀이를 요구하기도 합니다.
이 글에서는 자바에서 문자열을 뒤집는 대표적인 방법들을 난이도별로 정리해 소개합니다.
자바에서 문자열을 뒤집는 가장 쉬운 방법: StringBuilder의 reverse()
가장 간단하면서도 실무에서 널리 사용되는 방법은 StringBuilder 클래스가 기본 제공하는 reverse() 메서드를 활용하는 것입니다. 단 한 줄의 코드로 문자열을 뒤집을 수 있어 가독성과 성능 면에서 모두 유리합니다.
예제 코드:
package io.devqa.tutorials;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ReverseString {
String reverse(String inputString) {
return new StringBuilder(inputString).reverse().toString();
}
@Test
public void testAWord() {
assertEquals("tobor", new ReverseString().reverse("robot"));
}
}
함께 읽으면 좋은 관련 글
- 자바에서 toString()을 오버라이드해야 하는 이유
- 자바에서 문자열(String)을 비교하는 방법
- 문자열에서 숫자만 추출하는 방법
- 자바에서 문자열을 정수(int)로 변환하는 방법
charAt()과 반복문으로 문자열 뒤집기
내장 메서드를 사용하지 않고 직접 구현해야 하는 상황이라면, String 클래스의 charAt() 메서드와 반복문을 조합하는 방법이 좋습니다. 문자열의 끝에서부터 앞으로 이동하며 문자를 하나씩 새로운 StringBuilder에 추가하는 방식입니다.
예제 코드:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ReverseString {
String reverse(String inputString) {
StringBuilder reverseStringBuilder = new StringBuilder();
for(int i = inputString.length() - 1; i>=0; i--){
reverseStringBuilder.append(inputString.charAt(i));
}
return reverseStringBuilder.toString();
}
@Test
public void testAWord() {
assertEquals("tobor", new ReverseString().reverse("robot"));
}
}
toCharArray()를 활용한 변형 구현
같은 로직을 toCharArray() 메서드로도 구현할 수 있습니다. 문자열을 문자 배열로 변환한 뒤 배열을 순회하면서 각 문자를 결과 문자열의 맨 앞에 덧붙이는 방식입니다.
예제 코드:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ReverseString {
String reverse(String inputString) {
String outString = "";
for(char c : inputString.toCharArray()) {
outString = c + outString;
}
return outString;
}
@Test
public void testAWord() {
assertEquals("tobor", new ReverseString().reverse("robot"));
}
}
다만 이 방식은 반복할 때마다 새로운 String 객체가 생성되므로 문자열이 길어질수록 성능이 떨어질 수 있습니다. 학습용 예제로는 적합하지만, 실무에서는 StringBuilder를 사용하는 것이 좋습니다.
재귀 호출(Recursion)로 문자열 뒤집기
면접에서 종종 요구되는 또 다른 방식은 재귀 호출을 이용한 풀이입니다. 첫 번째 문자를 결과의 마지막에 붙이고, 나머지 부분에 대해 자기 자신을 다시 호출하는 구조로 동작합니다.
예제 코드:
class ReverseString {
String reverse(String inputString) {
if (inputString.isEmpty()) {
return inputString;
}
return reverse(inputString.substring(1)) + inputString.charAt(0);
}
}
재귀 방식은 코드가 간결하다는 장점이 있지만, 문자열이 길어지면 스택 오버플로(StackOverflowError)가 발생할 위험이 있으므로 실무 코드에서는 신중하게 사용해야 합니다.
Java 8 스트림(Stream) API로 문자열 뒤집기
자바 8 이상 환경이라면 스트림 API를 활용해 함수형 스타일로 문자열을 뒤집을 수도 있습니다. 인덱스를 역순으로 생성한 후 해당 위치의 문자를 하나씩 꺼내어 하나의 문자열로 연결하는 방식입니다.
import org.junit.jupiter.api.Test;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ReverseString {
String reverse(String inputString) {
return IntStream.range(0, inputString.length())
.mapToObj(x-> inputString.charAt((inputString.length()-1) - x))
.map(character -> String.valueOf(character))
.collect(Collectors.joining(""));
}
@Test
public void testAWord() {
assertEquals("tobor", new ReverseString().reverse("robot"));
}
}
마무리
일상적인 개발에서는 StringBuilder.reverse()를 사용하는 것이 가장 간편하고 효율적입니다. 반면 면접 대비를 위해서는 charAt(), toCharArray(), 재귀 호출, 스트림 API 등 다양한 접근 방식과 각 방법의 장단점을 함께 익혀두는 것이 좋습니다. 여러 구현 방식을 자유롭게 설명할 수 있다면 기술 면접에서 큰 강점이 될 것입니다.