본문 바로가기
Java

자바 valueOf()

by 코리늬 2019. 3. 28.

자바 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() == 기본 자료형을 문자열로 변경한다.

'Java' 카테고리의 다른 글

[Java] 자바 transient  (0) 2019.07.16
[Java] 자바 직렬화 (Serialize)  (0) 2019.07.15
split 세부적으로 사용하기  (0) 2019.04.22
[Effective Java] try with resources  (0) 2019.03.29
Iterator  (0) 2019.03.26

댓글