olrlobt
[Java] Integer.toString()와 String.valueOf()의 차이 본문
정수를 문자열로 변환할 때, 당연하게 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() 메서드를 사용하기 때문이다.
그렇다면 여기서 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를 인자로 받고 있기 때문에 발생한다.
그렇다면, String.valueOf에서는 왜 에러가 나지 않고 출력이 나왔을까?
그 이유는String.valueOf의 경우 Wapper클래스에서 오버라이딩 하게 되면,기본형에서 오버라이딩한 메서드와는 다른, Object를 인자로 받는 메서드를 오버라이딩 하기 때문에,호출 결과가 조금 다르게 작동하게 된다.
앞서 본 int의 valueOf 와는 다르게 Wrapper class가 null일 경우를 처리해 주는 것을 알 수 있고,
따라서 NPE를 던지지 않고 null을 잘 출력해 주게 된다.
'Java > Java' 카테고리의 다른 글
[Java] 자바에서 싱글톤(Singleton)패턴을 적용하는 방법 (0) | 2023.12.29 |
---|---|
[Java] 빌더 패턴(Builder Pattern)을 사용하는 이유와 구현 (1) | 2023.12.22 |
[Java] 생성자 대신 정적 팩토리 메서드를 고려하라 (1) | 2023.12.21 |
[JAVA] Garbage Collection(GC , 가비지 컬렉션)과 Garbage Collector의 종류 (1) | 2023.10.19 |
[Java] 람다식, 함수형 인터페이스와 메소드 참조(::) (0) | 2023.07.14 |