toString()과 String.valueOf ()는 모두 String 클래스에 존재하는 메서드다. 두 메서드 모두 문자열을 반환한다는 공통점을 가지고 있는데, 두 메서드의 특징이 어떤 것인지, 두 메서드 간 차이점은 무엇인지 정리해 보고자 한다.
1. toString()
toString() 메서드는 정확히 말하면 모든 클래스의 최고 조상인 Object의 메서드로부터 온 것이다. String 클래스 역시 이 Object를 상속하고 있기 때문에 toString() 메서드를 가지고 있다. 아래 java 공식 문서를 확인해 보면 Object 클래스의 메서드를 오버라이드를 한 것임을 확인할 수 있다. 원래 Object 클래스의 toString()은 인스턴스에 대한 정보를 문자열로 반환한다. 즉 아래 코드처럼 "클래스이름@hashCode"를 반환한다. 그런데 String 클래스는 이를 오버라이딩 했기 때문에 반환값으로 문자열 데이터의 "값"을 반환한다.
public String toString() { // Object 클래스 내 toString()
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
사실 String 클래스의 toString() 메서드를 보면 this라는 객체 자신을 반환하는 것을 알 수 있다. 분명 문자열 데이터 값을 반환한다고 했는데 이 점이 모순되는 것 같아 chatGPT한테 물어봤는데 컴파일러와 JVM에서 String을 특별하게 취급한다고 한다. 보통 객체가 this를 반환한다고 하면 객체 자신을 반환해 주소값을 가지고 있지만 String 클래스에서는 this가 내부적으로 문자열 데이터를 가리키도록 되어 있다는 것이다. 예제 코드를 확인해 보면 쉽게 이해할 수 있다.
public class Test {
public static void main(String[] args) {
String str = "hello";
System.out.println(str); // hello
System.out.println(str.toString()); // hello
str = null;
System.out.println(str.toString()); // NullPointerException 예외 발생!
}
}
System.out.println(str)과 System.out.println(str.toString())의 결과가 같은 것은 딱 'String 변수'를 사용했기 때문이 아니라 참조변수의 출력이나 문자열 결합 때 컴파일러가 자동으로 toString()을 호출해 처리하기 때문에 같은 결과를 내는 것이다. String의 값으로 null이 들어오면 NullPointerException 예외가 발생한다.
cf. 객체 배열을 출력할 때 원소 '값'을 출력하기 위해서는 반드시 각 객체의 클래스마다 toString()으로 재정의해야 한다.
2. String.valueOf()
String.valueOf() 메서드는 매개변수로 들어온 값을 String으로 바꾸어 반환한다. 아래에 매개변수로 int/long 형인 메서드만 가져왔는데 boolean, char, char[], float/double, Object까지 다 가능하다. 이들 모두 인수 값을 String으로 반환한다.
valueOf() 메서드는 Object 클래스에 있지는 않지만 Integer, Double, Float, Double 등에도 있다. 각각 자신의 클래스 타입을 반환한다는 것을 통해 valueOf() 메서드는 해당 클래스 타입을 반환한다는 것을 추가로 알 수 있다.
String str = "hello";
String str2 = null;
int numInt = 123;
double numDouble = 123.12415;
boolean bool = true;
System.out.println(String.valueOf(str)); // hello
System.out.println(String.valueOf(str2)); // null
System.out.println(String.valueOf(str2).getClass().getName()); // java.lang.String
System.out.println(String.valueOf(numInt)); // 123
System.out.println(String.valueOf(numDouble)); // 123.12415
System.out.println(String.valueOf(bool)); // true
코드를 실행해 보면 위처럼 출력된다. 별다를 게 없어보이지만 인상적인 것은 String에 null 값이 들어있다고 해도 toString() 때와 달리 NullPointerException이 발생하지 않는다는 것이다. String.valueOf(null)의 반환값이 String이기 때문에 클래스 이름을 출력해 보면 java.lang.String이 나온다. 내부 코드를 살펴보면 객체가 null일 때는 문자열인 "null"을 출력하도록 되어 있다. 그리고 바로 옆을 보면 null이 아닐 때는 toString()을 써서 문자열로 반환하도록 나와 있다. 오버로딩된 다른 메서드들 또한 다른 클래스 내부의 toString() 메서드를 사용하고 있었다.
반대로 Character 클래스의 toString() 메서드에서는 내부적으로 String 클래스의 valueOf() 메서드를 호출한다. 이렇듯 내부적으로 서로를 호출해 사용하는 것 같았다. 그냥 toString()과 String.valueOf() 모두 String을 반환한다는 점에서 공통점을 갖고 null 값을 가질 때만 출력에 차이가 있다는 정도로 기억해도 좋을 것 같다.
https://swjeong.tistory.com/146
[Java] toString()과 String.valueOf()의 차이점
두 메소드 모두 Object의 값을 String으로 변환하지만 변경하고자 하는Object가 null인 경우 다르다.toString()과 같은 경우 Null PointerException(NPE)을 발생시키지만 valueOf는 "null"이라는 문자열로 처리한다.
swjeong.tistory.com
https://blog.naver.com/gglee0127/221287052764
Java char를 String으로 변환하기
Character 클래스 toString() 메서드Character 클래스의 toString() 메서드를 호출하면 내부적으로 St...
blog.naver.com
https://blog.naver.com/asap0628/220722238185
[예제로 보는 함수 - java]BigInteger - 선언하기, BigInteger - 출력하기, BigInteger.toString(i) - i진법으로
예제로 보는 BigInteger - 선언하기, BigInteger - 출력하기, BigInteger.toString(i) - i진법으로 ...
blog.naver.com
https://7942yongdae.tistory.com/178#google_vignette
Java - 객체를 문자로 표현하는 toString()을 잘 사용하는 방법
자바에서는 객체를 문자화 시킬 때 toString()을 사용합니다. 대부분 사람들이 처음 toString()을 배울 때 단순한 출력문 함께 배우기 때문에 toString()을 인스턴스를 표현하는 @어쩌고의 문자 값 정도
7942yongdae.tistory.com
☕ 자바 toString 오버라이딩 - 완벽 이해하기
toString 메소드 기본적으로 Object 클래스의 toString() 메소드는 해당 인스턴스에 대한 정보를 문자열로 반환한다. 이 메서드는 인스턴스에 대한 정보를 문자열로 제공할 목적으로 정의되어 있는 것
inpa.tistory.com
'JAVA' 카테고리의 다른 글
[JAVA] comparable, comparator 비교 (0) | 2024.07.03 |
---|---|
[JAVA] System.in.read() (1) | 2024.06.30 |
[JAVA] delete(), deleteCharAt() (0) | 2024.05.07 |
[JAVA] clone(), 얇은 복사와 깊은 복사 (0) | 2024.03.26 |
[JAVA] String, Stringbuffer, Stringbuilder 차이 (1) | 2024.03.14 |