2009/01/09 00:25 | 개발 이야기/Java

 우리는 제일 처음 자바를 배울 때 앞 단원에서 프리미티브 타입과 Wrapper 클래스에 대해서 배웁니다. 그리고 곧 잊어버리게 됩니다. 코딩을 하다 보면 어느순간 부터인가 프리미티브 타입이나 Wrapper 클래스에 대해 생각하지 않고 코딩을 하게 되기 때문입니다. 아니 사실 처음부터 신경쓰지 않고 코딩을 했을지도 모릅니다.

 오늘은 우리가 평소에 신경쓰지 않고 코딩하던 부분에 대해서 다시 한번 생각해보도록 하겠습니다.
다음은 제가 '[String 비교하기] .equals()와 ==은 다른가요?'에서 마지막에 보여드렸던 코드입니다.


public class Test {

/**
* @param args
*/
public static void main(String[] args) {
new Test().testInteger();
}

public void testInteger() {
int a = 1;
int b = 1;
Integer c = new Integer(1);
Integer d = new Integer(1);
System.out.println("1:"+System.identityHashCode(a));
System.out.println("2:"+System.identityHashCode(b));
System.out.println("3:"+System.identityHashCode(c));
System.out.println("4:"+System.identityHashCode(d));
System.out.println("5:"+(a == b));
// System.out.println("6:"+a.equals(b));
System.out.println("7:"+(c == d));
System.out.println("8:"+c.equals(d));
System.out.println("9:"+(a == c));
}
}


이 코드를 실행시키면 다음과 같은 결과를 얻을 수 있습니다.
사용자 삽입 이미지

1번부터 8번까지는 '[String 비교하기] .equals()와 ==은 다른가요?'를 잘 읽어 보셨다면 어느정도 감이 오실껍니다.
 아... '[String 비교하기] .equals()와 ==은 다른가요?'는 기억이 잘 안나신다구요? 그럼 제가 다시  간단하게 요약하자면 여기서 a,b는 프리미티브 타입으로 하나의 '값'이라고 보시면 됩니다. 하지만 c,d는 '값
'이 아니라 '객체'입니다.
 그런데 왜 9번은 결과가 true일까요? 분명히 프리미티브 타입(값)과 Wrapper 클래스를 비교했는데 결과는 왜 같다고 나왔을까요? 그것은 바로 '자동 UnBoxing'에 있습니다. 9번에서는 프리미티브 타입과 Wrapper 클래스를 비교했는데요. 이때 비교 대상이 프리미티브 타입이라는걸 알고 있기 때문에 Wrapper 객체에서 자동으로 값을 꺼내서 프리미티브 타입 대 프리미티브 타입으로 바꿔서 비교해 주는 것입니다.
 이와 반대로 자동 Boxing은 Wrapper 객체가 와야 할 자리에 프리미티브 타입이 오면 프리미티브 타입을 자동으로 Wrapper 객체로 만들어 주게 됩니다. 하지만 '[String 비교하기] .equals()와 ==은 다른가요?'에서 String은 자동 Boxing, 자동 UnBoxing 기능이 없기 때문에 9번처럼 비교하면 당연히 false가 나오게 됩니다.

 글 솜씨도 없고 재미도 없는 포스트 끝까지 읽어 주셔서 감사합니다. 기본기만 하면 너무 심심하니 다음에는 DWR을 이용한 Ajax, Reverse Ajax 사용하기를 한번 포스트 해볼 생각입니다. 많이 기대해 주세요.^^
크리에이티브 커먼즈 라이센스
Creative Commons License
2009/01/09 00:25 2009/01/09 00:25
Trackback Address :: http://westzero.net/trackback/22
  1. Java의 auto boxing과 unbox은 어떻게 컴파일될까?

    Tracked from 개발을 통한 자기수양 - benelog 2009/02/10 08:21

      아래 코드는 프리미티브 타입과 Wrapper 클래스, 자동 Boxing, 자동 UnBoxing이라는 글에 나오는 것을 입력해 본 것입니다. int와 java.lang.Integer객체를 "=="와 "equals()"메소드로 비교하고 있습니다.&nb