6. Java 강좌, 연산자 3
연산 시 주의사항 1
class calcint1
{
public static void main(String[] args)
{
int a = 1000000; // 백만
int b = 1000000; // 백만
long c = a*b;
System.out.print(c);
}
}
위의 코드중 변수 c의 변수 타입은 long 입니다.
long자료형은 1,000,000,000,000을 충분히 저장할 수 있는데요,
위의 연산에서 결과 값으로 1,000,000,000,000가 출력될 것 같지만, 결과는 -727379968이 출력됩니다.
그 이유는 저번 강좌에서 본 것처럼 int 형의 사칙연산 결과는 int 형으로 연산됩니다.
즉, 이미 사칙연산이 끝났을 때는 이미 -727379968으로 연산이 되어버린거죠.
이것을 정상적으로 연산하려면 피연산자 둘 중 하나를 long변수형으로 바꾼 뒤 연산을 해야합니다.
두 값중 하나라도 long 형인 상태로 연산을 하게 되면 더 큰 변수 타입을 따라가기 때문에 올바른 값을 나타낼 수 있습니다.
class calcint2
{
public static void main(String[] args)
{
int a = 1000000 * 1000000 / 1000000;
int b = 1000000 / 1000000 * 1000000;
System.out.print(a + "\n" + b);
}
}
이번에는 자주 나올 수 있는 실수입니다.
위에서 a의 연산은 1000000 * 1000000 / 1000000; 이고, b의 연산은 1000000 / 1000000 * 1000000;입니다.
상식적으로 계산을 할 경우 a와 b의 연산 값은 동일한게 맞습니다.
하지만 기계는 인간의 상식과는 조금 다릅니다.
연산을 해보자면 a는 1000000 * 1000000을 먼저 하게 되고, 1,000,000,000,000라는 값이 나옵니다.
위에서 본 값과 똑같죠?
여기서도 int 연산이므로 1,000,000,000,000를 전부 받지 못하고 -727379968이라는 값으로 변해버립니다.
그 다음 / 1000000 을 연산 해주니 위의 이미지처럼 -727이라는 값이 나오게 됩니다.
b의 경우는 1000000 / 1000000 을 먼저 연산 하니 1이 되고, 그 다음 1000000 을 다시 곱하므로 정상적으로 1000000 이라는 값이 나오게 되는거죠.
위의 연산을 살펴보면 * 를 먼저 수행한 a는 오버플로우가 발생해서 원하는 값과 다른 값이 나오게 되었고 b는 원하는 값을 나타내었습니다.
이처럼 연산의 순서에 따라 값이 달라질수 있다는것을 주의하면서 프로그래밍을 해야합니다.
'Programming > Java' 카테고리의 다른 글
8. Java 강좌, 연산자 5 (0) | 2015.02.16 |
---|---|
7. Java 강좌, 연산자 4 (0) | 2015.02.12 |
5. Java 강좌, 연산자 2 (2) | 2015.02.08 |
4. Java 강좌 연산자 1 (2) | 2015.02.02 |
3. Java 강좌, 변수(Variable) 2 (0) | 2015.01.29 |