자바 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 |
댓글