[java] char 배열을 String으로 변환하기: new String()과 toString()의 차이

CHOI HONGSEO·2026년 4월 7일

알고리즘 문제를 풀거나 문자열을 특정 인덱스 단위로 수정해야 할 때, 문자열을 문자 배열(char[])로 쪼갠 뒤 다시 합치는 작업을 자주 하게 됩니다. 이 과정에서 많은 자바 입문자들이 toString()을 사용했다가 엉뚱한 출력값을 보고 당황하곤 합니다.

오늘은 char[]String으로 변환하는 정석적인 방법과, 왜 다른 방식들이 실패하는지 그 이유를 명확히 정리해 보겠습니다.


1. new String(arr) 사용하기

자바에서 가장 정석적이고 빠르게 문자 배열을 문자열로 변환하는 방법은 String 클래스의 생성자를 사용하는 것입니다.

String myString = "apple";

// 1. 문자열을 낱개 글자 배열(char[])로 분리
char[] arr = myString.toCharArray(); 

// (배열의 내용 수정 작업 진행...)
arr[0] = 'A';

// 2. 수정된 문자 배열을 다시 하나의 문자열로 병합
String result = new String(arr); 

System.out.println(result); // 출력: Apple

동작 원리:
자바에서 String 객체는 내부적으로 문자들의 배열(char[]) 형태로 데이터를 관리합니다.
따라서 new String(arr)처럼 생성자에 문자 배열을 넘겨주면, 자바는 해당 배열의 요소들을 순서대로 읽어 완벽한 형태의 새로운 String 객체로 재조립하여 반환해 줍니다.


2. 왜 기존 방식에서는 '주소값'이나 '이상한 형태'가 나왔을까?

문자열로 바꾸기 위해 무작정 .toString()을 호출하거나 Arrays.toString()을 사용했다면 다음과 같은 실패를 겪게 됩니다. 이는 두 메서드의 본래 목적이 다르기 때문입니다.

케이스 A: arr.toString()을 쓴 경우 (메모리 주소값 출력)

char[] arr = {'a', 'p', 'p', 'l', 'e'};
System.out.println(arr.toString()); 

// 실제 출력: [C@15db9742 (해시코드)

배열 객체에 직접 .toString()을 호출하면 배열 내부의 글자들이 합쳐지는 것이 아닙니다. 자바에서 배열은 객체(Object)이므로, 최상위 클래스인 Object의 기본 toString()이 동작하여 "이 객체가 위치한 메모리 주소(해시코드)"를 문자열로 반환하게 됩니다.

케이스 B: Arrays.toString(arr)을 쓴 경우 (디버깅용 출력)

char[] arr = {'a', 'p', 'p', 'l', 'e'};
System.out.println(Arrays.toString(arr)); 

// 실제 출력: [a, p, p, l, e]

Arrays.toString()은 배열 안의 데이터를 확인하기 위해 자바가 제공하는 배열 상태 확인용(디버깅용) 유틸리티입니다.
따라서 우리가 원하는 매끄러운 단어 형태("apple")가 아니라, 배열의 구조를 그대로 보여주는 대괄호([])와 쉼표(,)가 포함된 형태의 문자열을 만들어 버립니다. 알고리즘 문제의 정답(순수 문자열)으로는 사용할 수 없습니다.


보너스 꿀팁: 실수(소수) 입력받기

문자열이나 알고리즘 문제에서 콘솔 입력을 받을 때, 데이터 타입에 맞는 파싱(Parsing) 메서드를 사용하는 것도 매우 중요합니다.

정수를 받을 때는 Integer.parseInt()를 사용하지만, 소수점이 포함된 실수 값(예: 3.14)을 입력받아야 할 때는 반드시 Double 클래스를 사용해야 에러(NumberFormatException)가 발생하지 않습니다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

// 정수를 받을 때
int num1 = Integer.parseInt(br.readLine());

// 실수를 받을 때 (double 타입)
double num2 = Double.parseDouble(br.readLine());
profile
곧 성공할 개발자입니다.

0개의 댓글