scaleform.minarto.com

for(var i:uint 아무 생각 없이 쓰다가는 컴퓨터 다운된다... 본문

ActionScript

for(var i:uint 아무 생각 없이 쓰다가는 컴퓨터 다운된다...

미나토 2007. 6. 12. 16:47
숫자를 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 로 처리하는 것이다.