olrlobt

[Java] Integer.toString()와 String.valueOf()의 차이 본문

Java/Java

[Java] Integer.toString()와 String.valueOf()의 차이

olrlobt 2023. 8. 4. 14:21

정수를 문자열로 변환할 때, 당연하게 String.valueOf()만을 사용하고 있었는데, 알고리즘 스터디를 진행하며 Integer.toString()를 사용하는 경우를 보게 되었고 차이에 의문을 갖게 되었다.

 

int pri = -3;

String valueOf = String.valueOf(pri);
System.out.println(valueOf);

String toString = Integer.toString(pri);
System.out.println(toString);

//-3
//-3

Integer.toString() vs String.valueOf()

Java에서는 정수를 문자열로 변경할 때, 일반적으로 두 가지를 이용할 수 있고,

이 메서드들은 변환하는 정수 타입이 int (Primitive type) 이냐, Integer (Wrapper class) 이냐에 따라 약간의 차이가 발생하게 된다.

 

int (Primitive type)

기본적으로 int를 사용할 때는, 두 메서드는  완벽히 동일한 작동을 하게 된다.

 

그 이유는 String 클래스의 valueOf 메서드 자체가 Integer.toString() 메서드를 사용하기 때문이다.

int가 오버라이드한 valueOf() 메소드

 

그렇다면 여기서 valueOf를 사용하는 것이, 메서드를 하나 더 호출하니까 호출 스택이 하나 늘어나서 성능적으로 안 좋은 것이 아니냐는 의문이 들 수 있는데,

 

JVM에서의 메서드 최적화 프로세스인 인라이닝을 통해, 결과적으로는 아주 같은 결과를 제공하게 된다.

 

 

Integer (Wrapper class)

Wrapper class 인 Integer 같은 경우에, null이 아닌 값을 사용할 때에는

String.valueOf() 메서드와 Integer.toString() 메서드 모두 기본형인 int의 결과와 같은 결과를 제공한다.

 

Integer wrapper = -3;

String valueOf = String.valueOf(wrapper);
System.out.println(valueOf);

String toString = Integer.toString(wrapper);
System.out.println(toString);

// -3
// -3

 

하지만 Integer의 값이 null 일 경우를 보자. 

Integer wrapper = null;

String valueOf = String.valueOf(wrapper);
System.out.println(valueOf);

String toString = Integer.toString(wrapper);
System.out.println(toString);

 

이 경우, String.valueOf()의 경우에는 값이 잘 나오지만,

Integer.toString() 메서드에서 NPE(NullPointerException)를 던진다.

 

이런 결과가 나오는 이유는

Integer의 toString() 메서드와 int의 toString() 메서드가 같은 메서드를 호출하고 있고, 이 메서드는 Wrapper클래스인 Integer가 아닌, int를 인자로 받고 있기 때문에 발생한다. 

int 와 같은 메소드를 호출하고 있다.

 

그렇다면, String.valueOf에서는 왜 에러가 나지 않고 출력이 나왔을까?

 

그 이유는String.valueOf의 경우 Wapper클래스에서 오버라이딩 하게 되면,기본형에서 오버라이딩한 메서드와는 다른, Object를 인자로 받는 메서드를 오버라이딩 하기 때문에,호출 결과가 조금 다르게 작동하게 된다.

Integer가 오버라이드한 valueOf() 메소드

앞서 본 int의 valueOf 와는 다르게 Wrapper class가 null일 경우를 처리해 주는 것을 알 수 있고,

따라서 NPE를 던지지 않고 null을 잘 출력해 주게 된다.

 

 

Comments