BGM용 세이라디오
열기▼       고정
전체
글목록

for, while 등의 루프가 무한 반복되는 것에 주의하라.

수요일, 11월 27, 2013
일어날 수 있는 에러와 가능성을 모두 고려하지 않았을 때, 간혹 무한루프에 빠져 페이지 로딩이 불가능해지는 경우가 생긴다.


예시

예를 들어, "문자열1 문자열2 (문자열3 )..."과 같은 형식의 문자열을 나눠서 이웃한 문자열마다 어떤 작업을 하도록 하는 JS 코드가 있다고 하자.
var s=[문자열];
s=s.split(" ");
s=s.splice(0,s.length-1);
for(i=0;i!=s.length-1;i++){
...
}
위의 예시에서 splice를 이용해 마지막 항을 제거하는데, 문자열이 공백으로 끝나면 split 결과에 빈 문자열("")이 하나 더 딸려오기 때문이다.
위의 예시는 잘 작동한다. 그러나 문자열이 ""일 경우에는 문자열의 형식에는 맞을지 몰라도 프로그램에서는 오류가 발생한다.
var s="";
s=s.split(" "); -->s=[""];
s=s.splice(0,0); -->s=[];
s가 빈 array이므로 s.length-1=0-1=-1이다. 따라서 그 밑의 for 루프에서 i!=-1은 언제나 참이 되어 무한 루프가 된다.

해결책

특수한 값의 경우 프로그래밍을 할 때 가상 테스트를 거치는 것이 좋다. 예를 들어 소수에서 정수를 얻어 소수점 아래의 값(0.xxx...)을 얻으려는 경우 정수(1, -1 등)를 테스트해보는 것이 좋다. 위의 경우에도 "", "문자열1 ", "문자열1 문자열2 ", ...와 같은 형식을 따르지만, 맨 처음 값인 ""은 프로그램에 오류를 발생시켰다. 이처럼 맨 처음, 맨 끝 값은 거의 필수적이고, 두번째 값까지 시도해보면 더욱 좋다.
첫 댓글을 써주세요!

댓글을 인용하려면 @![댓글 ID]!@와 같이 쓰시면 됩니다. "@!" 와 "!@"를 쓰시려면 "+@+!+", "+!+@+"와 같이 써주세요.

페이스북 댓글
.post-outer{ -webkit-transform:none; transform:none; display:inline; padding:0; margin:0; border-width:0; } .hentry>div{ display:none; }