Java

자바 valueOf()

코리늬 2019. 3. 28. 17:11

자바 valueOf

Wrapper 클래스들(Integer, Character, Double, String 등)은 모두 valueOf메소드를 가지고 있다.

valueOf 메소드를 통한 객체와 new 키워드를 통한 객체에는 차이점이 있다.

가능하면 valueOf메소드를 사용해야 한다.

 

간단하게 보면

Integer a = 10;
Integer b = new Integer(10);
Integer c = Integer.valueOf(10);

위 값을 서로 비교하면 어떻게 될까?

 

a와 c는 같지만 b와는 다르다는 값이 나오게된다.

Wrapper 클래스는 내부적으로 캐시가 존재하기 때문이다.

 

오토박싱과 valueOf 메소드는 이 캐시를 통해 객체를 가져온다.

반면, new는 캐시와 상관없이 새로운 객체를 생성한다.

그래서 valueOf 메소드가 있는데 new 객체로 새로운 객체를 생성하는 것은 불필요하다.

 

또한, 내가 겪은 에러사항 중 하나로는 "나는 분명히 값이 같으니까 같겠지."하고

String이라 가정하에 a.equals(b) 를하게되면 다르다는 결과가 나오게된다.

당연히 b는 새로 만든 객체기 때문에 서로 다르다는 결과가 나오게 된다.

이 부분을 주의해야한다.

 

추가적으로 방금 캐시를 통해 객체를 가져온다고 했는데, 각 Wrapper 클래스별로

캐시의 범위가 있다. 그래서 캐시의 범위를 넘어서는 객체를 사용하면 마찬가지로 결과가 달라진다.

예를들어 Integer클래스는 범위가 -128 ~ 127이다.

Integer a = 500;
Integer c = Integer.valueOf(500);

valueOf의 값이 캐시의 범위를 넘기 때문에 새로운 객체를 생성해서 반환한다.

그렇게 때문에 a == c 가 성립하지 않는다.

 

부가적으로 String을 '==' 연산자로 비교시 객체의 해시코드를 비교한다는 점을 알아두자.

String.valueOf() == 기본 자료형을 문자열로 변경한다.