블로그 이미지
플래시 개발자랍니다... 하지만 여긴 플래시 전문 블로그가 아닌 그냥 개인 블로그랍니다
미나토

Recent Comment

calendar

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
  • 40,987total
  • 8today
  • 22yesterday
2007/06/12 16:47 Flash Platform
숫자를 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
posted by 미나토
TAG as3, For, uint
2007/05/17 13:26 Flash Platform
trace(int(2.6)) // 2
trace(uint(2.6)) // 2

num >= 0 일 때,
int(num) = Math.floor(Number(num)) 과 같은 결과를 가진다. 간혹 Math.round 로 착각하는 실수를 하지 말자...


num < 0 일 때,
uint(num) = 4294967295 가 나오니 주의할 것.


trace(uint(undefined)) // 0
trace(uint(null)) // 0
trace(uint(true)) // 1
trace(uint(false)) // 0
trace(uint(NaN)) // 0
trace(uint("")) // 0

null 또는 Boolean 값이 들어왔을 때의 결과는 위와 같다. NaN이라고 나올거라 생각하는 실수 또한 주의 할 것...(int 도 마찬가지이다)


하나 더,

드로잉 수치에 int, uint 를 쓰면 오류는 안생기나 버그가 생길 가능성이 크다... 내림값이라 소숫점을 다 버려버리기 때문에 픽셀이 안맞을 수 있기 때문이다.
크리에이티브 커먼즈 라이선스
Creative Commons License
posted by 미나토