여기는 저의 2004~2007년까지의 기록입니다. 이 블로그는 이제 Tistory로 옮겼습니다.
2008년부터의 기록은 http://blog.studioego.info 로 가시기 바랍니다.

StudioEgo's Thoughts, seasonⅡ


JAVA의 문법이 이상한가?
이번에 책에 있는 Algorithm Psudocode를 C/C++/JAVA/Perl로 구현하는 재미있는 일을 했습니다.

그런데 JAVA에서 예상치도 못한 일들이 일어났다지요 -_-;;
JAVA에서 무슨 일이 났는지 컴파일을 하면 계속 에러를 냅니다 -_-;;
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at ex2.bin2(ex2.java:54)
at ex2.main(ex2.java:20)


이 에러는 배열의 Index에 -1을 참조했기 때문에 에러를 내면서 종료한다는 에러입니다.

C, C++, Perl에서도 비슷한 알고리즘을 썼는데 JAVA와 비교를 했죠.
C/C++의 경우

 41 int bin2(int n, int m)
42 {
43 int i, j;
44 int Bin2[n+1][m+1];
45 for(i = 0; i<= n; i++)
46 for(j = 0; j<= min(j, m);j++)
47 if(j == 0 || j == i)
48 Bin2[i][j] = 1;
49 else
50 Bin2[i][j] = (Bin2[i-1][j-1] + (2 * Bin2[i-1][j]));
51 return Bin2[n][m];
52 }


Perl의 경우

 24 sub bin2
25 {
26 my ($n, $m) = @_;
27 # Use array
28 my @B;
29 for(my $i = 0; $i <= $n; $i++)
30 {
31 for(my $j = 0; $j <= min($j, $m); $j++)
32 {
33 if($j == 0 || $j == $i)
34 {
35 $B[$i]->[$j] = 1;
36 }
37 else
38 {
39 $B[$i]->[$j] = $B[$i-1]->[$j-1] + (2 * $B[$i-1]->[$j]);
40 }
41 }
42 }
43 return $B[$n]->[$m];
44 }

JAVA의 경우

36     public static int bin2(int n, int m)
37 {
38 int [][]Bin2 = new int[n+1][m+1];
39 for(int i = 0; i<= n; i++)
40 for(int j = 0; j<= min(j, m);j++)
41 if(j == 0 || j == i)
42 Bin2[i][j] = 1;
43 else
44 Bin2[i][j] = (Bin2[i-1][j-1] + (2 * Bin2[i-1][j]));
45 return Bin2[n][m];
45 }


같은 알고리즘을 써서 컴파일을 했는데 C/C++/Perl에선 정상 값이 나오고 JAVA에서는 예외처리를 하니 참 어이가 없었죠.,
제 생각에 JAVA가 엄격한지 소스를 꼼꼼히 보았습니다.

i = 0일때 만약 j = 0이면 if(j == || j == i)라면 빠져나가야 합니다. 여기서는 문제 없는 듯 합니다.
i = 0일때 만약 j = 1이면 else구문을 실행하여 Bin2[0][1] = Bin2[-1][0] + (2 * Bin2[-1][0])을 실행해야 합니다.
그런데 min함수를 써서 return값이 작으면 for문이 j값을 증가시키지 않고 빠져나가게 합니다.

C/C++/Perl에서는 책에 있는 알고리즘을 그대로 써도 min값이 return되어서 상관 없는데 JAVA는 책에 있는 알고리즘이 잘못된 배열 참조한다는 것을 알아내서 예외처리를 하는 것을 보니 JAVA에서 for문 안에서 min함수 return값을 못알아 먹는 것 같아서 짜증이 나군요.

JAVA에서 이 알고리즘이 제대로 작동되지 않은 것 같아서 이런 꼼수를 썼습니다.

 36     public static int bin2(int n, int m)
37 {
38 int [][]Bin2 = new int[n+1][m+1];
39 for(int i = 0; i<= n; i++)
40 for(int j = 0; j<= min(j, m);j++)
41 if(j == 0 || j == i)
42 Bin2[i][j] = 1;
43 else if (i == 0)
44 break;
45 else
46 Bin2[i][j] = (Bin2[i-1][j-1] + (2 * Bin2[i-1][j]));
47 return Bin2[n][m];
48 }

i = 0일때 안의 for문을 무조건 빼지게 하였더니 C/C++/Perl과 같은 값이 나왔습니다.
이거 C/C++/Perl에서는 JAVA와 다르게 오류없이 돌아가는 것을 보니 왜그런 것일지 궁금하군요.

JAVA가 for문 안에서는 함수를 콜해서 return 값을 받아들이지 못하는 것 같아서 짜증이 나군요. C/C++/Perl에서는 아무런 문제가 없는데 말이죠.

컴퓨터프로그래밍 언어를 배우면 배울수록 궁금한것 투성인것 같네요,
by Ego君 | 2007/04/02 01:21 | 컴퓨터 | 트랙백 | 덧글(5)
트랙백 주소 : http://sungdh86.egloos.com/tb/3088524
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by daybreaker at 2007/04/02 02:39
흠, 근데 j <= min(j, m)이라고 굳이 쓸 이유가 있나요? j < m이라면 j <= j이니까 true일테고 j > m이라면 j > m이니까 false가 되는데, j == m인 경우는 어찌 처리되는지 궁금하네요. (그 경우가 하나로 정해진다면 부등호 하나로 처리할 수 있을 텐데..)
Commented by kkendd at 2007/04/02 06:05
전 이제 처음으로 JAVA 배우기 시작했는데 전 언제나 저런 경지에 다다를지 ㅠ;
Commented by 꿀호떡a at 2007/04/02 16:54
컴파일해보지 않아서 잘은 모르겠습니다만, C++ 문법에서 저렇게 쓰면 m이 1 이상일 경우 min 함수의 유무와 관계 없이 [-1][0]을 참조할것 같은데요.. j가 1일때 min(j,m)은 j일테니 j=j가 성립되어 실행하게 되지 않나요?

음. ms의 c++ 컴파일러는 가끔 저런것도 오류 없이 돌아가던데 말이지요.
Commented by Ego君 at 2007/04/02 17:04
꿀호떡a // 전 GNU C Compiler에서 돌렸는데 말이죠 ;ㅁ; MS C++에서도 오류 없이 돌아가고 등등 뭔가 이상합니다,.
Commented by Joo8111 at 2007/04/09 08:32
디버거로 한번 보세요. 저도 잘 돌려봐서 뭐라 말씀드리긴 뭣 하지만.. ^^;;

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >