단순 실험 2 - for vs while, ++ vs +1

Posted 2009/03/02 10:57 by 미나토




var st:uint = getTimer();

for(var i:uint; i<100000000; i=i+1);

trace(getTimer() - st);

621
622
564
620
564

var st:uint = getTimer();

for(var i:uint; i<100000000; i++);

trace(getTimer() - st);

708
708
708
708
707



var st:uint = getTimer();

var i:uint;
while(i++ < 100000000);

trace(getTimer() - st);

1419
1415
1414
1415
1423


결과 for 가 while 보다 빠르고 ++ 보다 +1 이 빠르다...


그런데 문제는 컴파일 후에 디컴파일을 하면 for 문은 while 문으로 바껴있다는 사실...


요컨데 진실은 저너머에...



크리에이티브 커먼즈 라이선스
Creative Commons License

Tag : ++, For, While

숫자를 0~10 까지 찍고 싶다고 치자

for(var i:uint=0; i<=10; i++)
{
    trace(i);
}

뭐, 당연히 아무 이상 없는 코드이다.

그럼 숫자를 역순으로 찍고 싶다고 하자

for(var i:uint=10; i>=0; i--)
{
    trace(i);
}

보통 이렇게 짜는 것이 일반적이다... 그러나 이것이 맞는 코드일까? 정답은 아니다...이다.
저렇게 했다가는 컴퓨터 다운되기 쉽상이다.


이 이유를 설명하기 위해서는 for 문과 uint 데이터타입에 대한 정확한 이해가 필요하다.

두번째 구문은 i는 10 부터 i-- 한 값이 0 이상이면 {} 안의 구문을 실행시킨다는 것이다. 여기서 놓쳐서는 안되는 것이 i-- 한 값이 0 이상이면 이다.

0 이상일 때까지 i-- 를 하란 것이 아니다.

결국 i-- 를 한 이후에 그 값을 0과 비교하게 된다. 바로 여기서 두번째 문제가 생긴다.

uint 데이터 타입은 0 ~ 4,294,967,295 (2^32-1) 까지의 정수를 나타낸다. - 값이 존재하지 않는 것이다. 만약 uint(-1) 처럼 음의 수를 캐스팅하게 되면 uint 의 최대치인 4,294,967,295 값이 나와 버린다.


for(var i:uint=10; i>=0; i--)

다시 두번째 코드를 차근차근 살펴보면 i 가 0이 된 후  -1 이 되어 반복문을 탈출하는 것이 아니라 그렇게 되기 전에 uint 로 캐스팅되어 4,294,967,295 값이 되어버리고 마는 것이다.


이제 다 왔다. 문제를 알았고, 원인을 알았다. 그럼 해결을 해야지...

이 이슈를 해결하기 위해서는 뭐, 몇가지 방법이 있을 것이다. 하지만 가장 간단한건 i를 Number 또는 int 로 처리하는 것이다.

크리에이티브 커먼즈 라이선스
Creative Commons License

Tag : as3, For, uint