[컴][자바] Integer 를 Long 으로 casting 하는 방법

java 에서 casting 시 주의사항 / integer 에서 long 으로 casting 이 안될 때  / mongo db numberlong 인 경우





mongodb 에서 값을 aggregation 해서 가져오는 데 그 값을 받아서 사용할 때 casting 을 하게됐다.

grouping(여기서는 $sum 을 실행했다.)을 실행하면서 mongodb 가 값을 NumberLong 으로 만든다. 그래서 결과값이
NumberLong(3738130734675) 
이런식으로 나왔다. 하지만 때때로 NumberLong 을 사용하지 않는 경우가 있다.
344646856
 이것은 아마도 grouping 등을 할 때 대상이 1개 뿐이어서 grouping 등을 실행하지 않았기 때문에 원래 collection 에 저장되어 있는 int 값을 가지고 있는 듯 하다.


{
    ...
        "_id" : {
            "cdn_svc_id" : 286,
            "datetime" : "20120629"
        },
        "bytes" : NumberLong(3738130734675)
    }, 
    {
        "_id" : {
            "cdn_svc_id" : 286,
            "datetime" : "20120630"
        },
        "bytes" : 344646856
    }
    ...

여하튼 그래서 java code 에서 casting 해줄 때 Integer 와 Long 의 두가지를 고려해야 했다. 그래서 googling 을 해보니 아래 같은 방법을 찾을 수 있었다.


(Long) casting 시 주의사항

만약 어떤 값이 Integer 가 될 수도 있고, Long 도 될 수 있는 경우가 있다고 하자. 이런 경우에 아래처럼 작성하면 Integer 가 나오는 경우에 ClassCastException 이 발생한다.
bytes = (Long)o.get("bytes");  // ~8,388,607 TB
Integer 를 Long 으로 Casting 하려고 했기 때문이다.

int 에서 long 으로의 casting 을 가능하지만, Integer 에서 Long 으로 casting 은 안된다고 한다. 이유는 아래 글을 참고하자.



이런 경우에 위의 link 에서 얘기하는 것처럼 상위 class 인 Number 를 사용해서 해결하자.

Number n = (Number)o.get("bytes");
bytes = n.longValue();  // ~8,388,607 TB

위와 같이 Number 로 받아서 값을 넘겨주면 된다.



댓글 없음:

댓글 쓰기