Java

StackOverflowError / SCJP 174번 문제

bang2001 2013. 7. 25. 16:49

StackOverflowError 는 말 그대로 프로그램이 실행하면서 할당받은 스텍영역의 메모리를


모두 소진하였을 때 발생하는 에러이다. 물론 실제로 소진된 이후에 에러가 발생하지는 않는다.

요즘 컴터의 성능이 좋아서 수업용으로 짜는 로직으로는 택도 없고,, 음.. 실무에서는 모르겠다.

하지만 분명한건 StackOverflowError 는 그리 오랜시간이 걸리지 않고 문제가 되는부분의 코드를 

실행하게 되면 바로 뜬다는 점이다. 컴파일시에는 나타나지 않고 실행중에 나타나게 되며,

주로 무한재귀함수(두개 이상의 메소드가 서로를 호출하는 경우, 뫼비우스의 띠 형태로 구현),

혹은 무한반복문을 통한 무한연산작용을 할 때 발생하게 된다.

SCJP 174번 문제의 예제이다. 다음 코드와 같은경우에서 StackOverflowError 가 발생하게 된다.

------------------------------------------------------------------------------------------

    ex) 무한재귀함수의 예
void doOne(int x) { doTwo(x); }
void doTwo(int y) { doThree(y); }
void doThree(int z) { doTwo(z); }

void counter(int i) { counter(++i); } <- 자기 자신을 무한호출

------------------------------------------------------------------------------------------

위와같이 무한호출하게 되는 형태로 로직을 짜게되면 StackOverflowError 가 발생하게 된다.

그리고 또하나! 예외의 이름을 보아하니 무한반복문을 통해서 유발시킬 수 있을거같다.

예를들어서 스텍영역의 메모리를 차지하는 맴버변수를 매번 새로이 무한생성하는 방법으로 말이다.

하지만 역시나.. 컴터가 좋아서 그런지 모르겠지만 유발할려고 해도 에러가 뜨지 않는다.

(혹시 모르겠습니다. 48시간정도 키면 혹시 뜰지도여...) 

분명한건 무한재귀함수를 사용시 이와같은 에러가 나니 주의하자!