안녕하세요. 톡방에서 Long 객체에 저장된 값을 Integer type으로 conversion을 할 수 있는지에 대한 질문을 받았습니다. 이에 대한 제 답은 그냥 intValue 메서드를 써서 int type으로 강제 형변환한 값을 꺼낸 다음에, boxing 시키라는 것이였습니다. 이 답변을 하고 난 후에, 코드를 보니, Number 클래스가 있어서 간단하게 알아보았습니다.

 

 


 이 클래스 안에는, intValue, longValue, floatValue, doubleValue, byteValue, shortValue 메소드가 있어요. 이들이 boxing 되어 있는 value를 type conversion하기 위한 것이다. 나름 합리적인 추론일 겁니다.

 

 

 설명을 봐도 유추할 수 있는데요. super class인데, 플랫폼 클래스들의 슈퍼 클래스라 되어 있어요. 그런데 이 클래스들은 numeric value들을 representing할 수 있는 것들입니다. 그리고 이 numeric value들은 원시 타입으로 바뀔 수 있는 값들입니다. 원시 타입으로 바뀔 수 있는 친구들을 표현하는 플랫폼 클래스들의 부모 클래스다. 정도로 해석하시면 됩니다.

 

 그러한 클래스들은 이 문서를 보시면 대략 감이 오실 듯 합니다. 그리고 중간에 Therefore 부분부터 보시면, lose 어쩌고가 나오는데요. 정보를 잃어버리거나, 정밀도를 잃어버릴 수도 있다는 언급이 있습니다. 일단 이 정도만 체크하고 넘어가 봅시다. 여기까지 대강 정리하면, 객체 내에 표현되어 있는 numeric value를 특정한 type으로 떨어트리기 위한 메서드들을 Number 클래스에서 추상화 시켰다고 봐도 될 거 같네요.

 

 


 Long 클래스를 보면 Number를 상속받는데요.

 

 

 intValue 메서드를 보면, 포장된 long value를 int 형으로 강제 형변환을 해 버립니다.

 

 

 Integer 클래스의 longValue는 어떨까요? 별 다를 바는 없습니다. 포장된 int value를 long 형으로 강제 형변환을 시켜 버립니다. 쉽게 말하자면, 포장된 numeric value를 int, long과 같은 primitive type으로 (conversion 하는 방식에 따라 변환해서) 떨어트리게 됩니다.

 

 


 Long을 Integer로 어떻게 바꾸면 될까요? 3이라는 값을 포장한 longV가 있습니다. 이 값을, int형을 포장하는 객체에 넣기 위해서 그냥, Long의 intValue 메서드로 unboxing(과 int type으로 형변환)을 합니다. 그 값을 Integer에 넣으면 됩니다. 이 과정을 4번째 줄에서 하였습니다.

 

 

 어렵지 않네요.

 

 

 그런데, XXXValue 같은 경우, 같은 타입이면 상관 없지만, 다른 타입이라면 형 변환을 하면서 생기는 정보 손실을 조심해야 하는데요. 일례로 long에서 int로 형변환 할 때 narrow conversion이 일어나 버립니다. 따라서 정보 손실이 일어날 수도 있는데요. 위에 있는 코드를 보면, 처음에 longV가 2147483648L이라는 값을 가지고 있었습니다. 

 

 

  그런데 이것을 int로 강제 형변환을 하려고 하다 보니, 정보가 손실되었네요.

 

 


 여담으로 BigInteger도 numeric한 정보를 표현하는 클래스이니, Number를 상속받을 겁니다. 문서에 나와 있기도 하고요.

 

 

 longValue 메소드를 잠깐 보게 되면, 아까와는 다르게 강제 형변환 하는 모습이 없어 보임을 알 수 있어요. BigInteger에 어떤 식으로 값이 들어가 있는지 이 글에서 대강 언급하였습니다만, 몰라도 별 상관이 없습니다. 대신에 수나, 분수와 같은 값을 저장한 객체에서, 저장된 값을 long, int type 등으로 떨어트리기 위해서 XXXValue 시리즈를 사용한다는 것 정도만, 얕게 알고 넘어가셔도 무난할 듯 싶습니다.