6. Java 강좌, 연산자 3

2015.02.10 20:18
저자 : Tailer

연산 시 주의사항 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
6. Java 강좌, 연산자 3  (0) 2015.02.10
5. Java 강좌, 연산자 2  (2) 2015.02.08
4. Java 강좌 연산자 1  (2) 2015.02.02
3. Java 강좌, 변수(Variable) 2  (0) 2015.01.29