
toString과 String.valueOf 메서드
toString 메서드와 valueOf 메서드는 둘 다 Object를 String으로 변환하는 도구입니다.
System.out.println(String.valueOf("hello"));
System.out.println("hello".toString());
위의 두 코드는 같은 값을 출력합니다. 그렇다면 똑같은 메서드를 2개나 만들어둔걸까요?
그렇지 않습니다.
String.valueOf 메서드와 toString 메서드의 가장 큰 차이점은 NullPointerException(이하 NPE)에 대한 처리 방식입니다.
- toString : 출력 객체가 null인 경우 NPE를 출력
- String.valueOf : 출력 객체가 null인 경우 null을 String 타입으로 출력
toString()

toString 메서드는 String 객체 그 자체를 반환합니다.
String.valueOf()

String.valueOf 메서드는 삼항연산자를 이용해서 객체가 null인 경우 에러를 발생시키지 않고 "null"이라는 문자열을 반환합니다. 그리고 null 값이 아닌 경우는 마찬가지로 toString 메서드를 반환하는 것을 볼 수 있습니다.
코드 예시
아래의 코드를 통해 각각의 메서드가 어떻게 출력을 하는지 확인해보겠습니다.
public class Test1 {
public static void main(String[] args) {
String str1 = "test";
String str2 = "";
String str3 = null;
System.out.println(String.valueOf(str1));
System.out.println(String.valueOf(str2));
System.out.println(String.valueOf(str3));
System.out.println("=========");
System.out.println(str1.toString());
System.out.println(str2.toString());
try {
System.out.println(str3.toString());
} catch (Exception e) {
System.out.println(e);
}
}
}
구분선(=)을 기준으로 위에선 valueOf 메서드를 사용했고, 아래는 toString 메서드로 출력했습니다.
출력
test
null
=========
test
java.lang.NullPointerException: Cannot invoke "String.toString()" because "str3" is null
valueOf 메서드로 출력하면 null 값인 str3 문자열은 null 문자열로 출력되는 것을 볼 수 있습니다.
그리고 toString 메서드로 출력한 null은 NPE를 출력하는 것을 볼 수 있습니다.
toString vs String.valueOf
그럼 두 메서드 중에 어떤 메서드가 프로그램에 더 적합할까요?
☞ String.valueOf
물론 둘 다 NPE에 대한 처리는 가능하지만 valueOf 메서드는 일단 자동으로 NPE를 처리하기 때문에 불필요한 코드를 작성할 필요가 없습니다. 하지만 toString은 try~catch문을 추가하면서 코드가 길어지고 성능 저하를 일으킬 수 있기 때문에 일반적으로 String.valueOf 메서드를 권장합니다.
.
.
.
마치며
자바 공부를 하면서 비슷한 메서드들을 많이 접했습니다. 이유 없이 똑같은 메서드를 만들진 않았을테니 하나하나 파고들고 싶은 오기가 생겼습니다. 그래서 공부한 내용들을 Notion에 주기적으로 정리하고 있습니다. 앞으로도 Notion에 정리된 내용들을 바탕으로 다시 깔끔하게 정리해서 블로그에 올리겠습니다!
피드백이나 질문은 댓글로 남겨주세요😊
'Java' 카테고리의 다른 글
| [Java] Pattern과 Matcher 클래스로 정규 표현식 제대로 사용하기 (1) | 2025.01.05 |
|---|---|
| [Java] Collections Framework간 변환 총정리 - List, Set, Map, Queue (1) | 2024.12.03 |
| [Java] BufferedReader 사용법과 자료구조 총정리 (1) | 2024.10.18 |
| [Java] compare 메서드에서 overflow가 발생하지 않는 이유 (0) | 2024.10.14 |
| [Java] Comparable과 Comparator로 정렬 이해하기 (0) | 2024.10.13 |