Autoboxing의 오묘함
Java : 2007. 9. 9. 21:07
오늘 AJN에서 Agile Java 스터디를 하던 중 예전에 작성했던 Auto (un)boxing은 -128~127 (4) 이 글을 살펴보게 되었습니다.
저 글을 작성할 당시 저 내용을 저도 제대로 이해하고 있지 않았었는데 이번에는 좀 더 이해가 되면서 오히려 의문스러운 점이 발생했습니다.(말이 좀 이상하지만;;)
간략하게 요약하면 다음과 같습니다.
위와 같은 호출이 있을 때 다음과 같은 결과가 나옵니다.
checkIntegerSame 메소드와 checkIntegerEquals 메소드는 다음과 같습니다.
이상하지 않으신가요..
맨 위에서 호출한 메소드들에 넘겨준 값들은 모두 primitive 타입 입니다. 그 값들이 checkIntegerSame 이 메소드의 인자로 넘어갈 때 Autobixing이 일어납니다.(Java 5 이상에서) 그래서 각각의 메소드에서 == 비교를 하는데...
이상한 부분은 제일 첫 번째 메소드 호출 checkIntegerSame(127, 127); 의 결과가 ii = 127, jj = 127 ==> jj is same ii. 이렇게 나왔다는 것입니다. 어떻게 같게 나올 수 가 있을까요?
if(new Integer(127) == new Integer(127)){
System.out.println("오.. 말도 안돼...");
}
위의 코드를 실행해서 "오.. 말도 안돼.."가 출력되는 거랑 같은 상황인 겁니다.(물론 위의 코드는 false가 되기 때문에 아무것도 출력하지 않습니다. 테스트 해 봤습니다.)
그렇다면 내릴 수 있는 가설은 하나....(지금 제 머릿속에서는 이것 밖에 생각이 나지 않습니다.)
무슨 말인고 하니.. 예를 들어, String s1 = "hi"; String s2 = "hi"; 이 때 다음과 같이 비교를 하면
if(s1 == s2) {
sysout("당연하지");
}
"당연하지"를 출력합니다. String 객체를 ""를 사용하여 만들 때 Immutable하게 만들기 때문입니다. 그러나 new 키워드를 사용하면 그렇치 않고 매번 객체를 생성하게 되죠. 이것과 마찬가지의 일이 Autoboxing에서도 일어나고 있다고 가설을 내려 봅니다.
저 글을 작성할 당시 저 내용을 저도 제대로 이해하고 있지 않았었는데 이번에는 좀 더 이해가 되면서 오히려 의문스러운 점이 발생했습니다.(말이 좀 이상하지만;;)
간략하게 요약하면 다음과 같습니다.
checkIntegerSame(127, 127); // same
checkIntegerSame(128, 128); // Not same
checkIntegerEquals(128, 128); // equals
checkIntegerSame(-128, -128); // same
checkIntegerSame(-129, -129); // Not same
checkIntegerEquals(-129, -129); // equals
checkIntegerSame(128, 128); // Not same
checkIntegerEquals(128, 128); // equals
checkIntegerSame(-128, -128); // same
checkIntegerSame(-129, -129); // Not same
checkIntegerEquals(-129, -129); // equals
위와 같은 호출이 있을 때 다음과 같은 결과가 나옵니다.
ii = 127, jj = 127 ==> jj is same ii.
ii = 128, jj = 128 ==> jj is NOT same ii!!
ii = 128, jj = 128 ==> jj is equals ii.
ii = -128, jj = -128 ==> jj is same ii.
ii = -129, jj = -129 ==> jj is NOT same ii!!
ii = -129, jj = -129 ==> jj is equals ii.
ii = 128, jj = 128 ==> jj is NOT same ii!!
ii = 128, jj = 128 ==> jj is equals ii.
ii = -128, jj = -128 ==> jj is same ii.
ii = -129, jj = -129 ==> jj is NOT same ii!!
ii = -129, jj = -129 ==> jj is equals ii.
checkIntegerSame 메소드와 checkIntegerEquals 메소드는 다음과 같습니다.
private static void checkIntegerSame(Integer ii, Integer jj) {
if (ii == jj) {
System.out.println("ii = " + ii + ", jj = " + jj + " ==> jj is same ii.");
}
else {
System.out.println("ii = " + ii + ", jj = " + jj + " ==> jj is NOT same ii!!");
}
}
private static void checkIntegerEquals(Integer ii, Integer jj) {
if (ii.equals(jj)) {
System.out.println("ii = " + ii + ", jj = " + jj + " ==> jj is equals ii.");
}
else {
System.out.println("ii = " + ii + ", jj = " + jj + " ==> jj is NOT equals ii!!");
}
}
if (ii == jj) {
System.out.println("ii = " + ii + ", jj = " + jj + " ==> jj is same ii.");
}
else {
System.out.println("ii = " + ii + ", jj = " + jj + " ==> jj is NOT same ii!!");
}
}
private static void checkIntegerEquals(Integer ii, Integer jj) {
if (ii.equals(jj)) {
System.out.println("ii = " + ii + ", jj = " + jj + " ==> jj is equals ii.");
}
else {
System.out.println("ii = " + ii + ", jj = " + jj + " ==> jj is NOT equals ii!!");
}
}
이상하지 않으신가요..
맨 위에서 호출한 메소드들에 넘겨준 값들은 모두 primitive 타입 입니다. 그 값들이 checkIntegerSame 이 메소드의 인자로 넘어갈 때 Autobixing이 일어납니다.(Java 5 이상에서) 그래서 각각의 메소드에서 == 비교를 하는데...
이상한 부분은 제일 첫 번째 메소드 호출 checkIntegerSame(127, 127); 의 결과가 ii = 127, jj = 127 ==> jj is same ii. 이렇게 나왔다는 것입니다. 어떻게 같게 나올 수 가 있을까요?
if(new Integer(127) == new Integer(127)){
System.out.println("오.. 말도 안돼...");
}
위의 코드를 실행해서 "오.. 말도 안돼.."가 출력되는 거랑 같은 상황인 겁니다.(물론 위의 코드는 false가 되기 때문에 아무것도 출력하지 않습니다. 테스트 해 봤습니다.)
그렇다면 내릴 수 있는 가설은 하나....(지금 제 머릿속에서는 이것 밖에 생각이 나지 않습니다.)
Autoboxing을 할 때 -128~127의 정수 값들은 Immutable한 Integer 객체로 다뤄지고 그 범위를 벗어나는 객체들은 매번 새로운 객체로 만들어 진다.
무슨 말인고 하니.. 예를 들어, String s1 = "hi"; String s2 = "hi"; 이 때 다음과 같이 비교를 하면
if(s1 == s2) {
sysout("당연하지");
}
"당연하지"를 출력합니다. String 객체를 ""를 사용하여 만들 때 Immutable하게 만들기 때문입니다. 그러나 new 키워드를 사용하면 그렇치 않고 매번 객체를 생성하게 되죠. 이것과 마찬가지의 일이 Autoboxing에서도 일어나고 있다고 가설을 내려 봅니다.
'Java' 카테고리의 다른 글
All About Sockets 2 (0) | 2007.09.26 |
---|---|
All About Sockets 1 (0) | 2007.09.26 |
Java에서 URL 다루기 2 (2) | 2007.09.26 |
Java에서 URL 다루기 1 (0) | 2007.09.18 |
자바 네트워크 프로그래밍 기초 지식 (0) | 2007.09.17 |
Autoboxing의 오묘함 (2) | 2007.09.09 |
객체 크기 구하기 (2) | 2007.08.14 |
때로는 공유하지 않는 것이 최선일 수 있다.(by ThreadLocal) (4) | 2007.08.10 |
ThreadLocal (0) | 2007.08.10 |
JMX (0) | 2007.06.06 |
Factory Method vs Constructor (0) | 2007.05.18 |
TAG Autoboxing
flyweight 패턴 비슷하게 구현된 것 아닐까요?
그런듯 합니다.
Flyweight 패턴을 자세히 보진 않고
http://compstat.chonbuk.ac.kr/rightway/designpatterns/flyweight.html
여기를 참조해서 살펴보았는데요. 왠지 그런 것 같네요.
좋은 정보 감사합니다.