개발공부/JAVA의 정석

chapter 3) 자바 연산자 정리: 정수 나눗셈, 오버플로우, 형변환 주의점

기억지기 개발자 2026. 6. 8. 12:23

📍 정수 나눗셈에서 소수점을 얻고 싶다면? 

자바에서 10 / 4는 두 피연산자가 모두 정수(int)이므로 결과도 정수로 계산되어 2가 출력된다.

System.out.println(10 / 4); // 2

소수점까지 포함된 결과를 얻고 싶다면 한쪽 이상을 실수형으로 변환해야 한다.

System.out.println((double) 10 / 4); // 2.5
System.out.println(10 / 4.0);        // 2.5

연산에 실수형이 포함되면 자바는 나머지 피연산자도 실수형으로 변환하여 계산하므로 2.5라는 결과를 얻을 수 있다.


📍 오버플로우가 발생한 후에 long에 저장해도 소용없는 이유 

long wrong = 1000000 * 1000000;     // int * int → int 연산
long correct = 1000000L * 1000000;  // long * int → long 연산

System.out.println(wrong);   // -727379968
System.out.println(correct); // 1000000000000

자바는 변수 타입이 아니라 피연산자의 타입을 기준으로 연산을 수행한다. 따라서 1000000 * 1000000은 두 값이 모두 int이므로 int 연산이 먼저 수행되고, 이 과정에서 오버플로우가 발생한다. 이후 이미 잘못 계산된 결과를 long 변수에 저장하는 것이므로 올바른 값을 얻을 수 없다.

 

따라서 큰 수를 연산할 때는 저장하는 변수만 long으로 선언하는 것이 아니라, 연산 자체가 long 타입으로 수행되도록 피연산자 중 하나를 long으로 만들어야 한다.


📍 char 연산에서 리터럴과 변수의 차이 

char c1 = 'a';
char c2 = c1 + 1;   // 컴파일 에러

char c3 = 'a' + 1;  // 정상

'a' + 1은 컴파일 시점에 결과를 미리 계산할 수 있는 리터럴 연산이므로 자바가 'b'(98)로 계산한 뒤 char에 저장한다.

반면 c1 + 1은 변수(c1)가 포함되어 있어 실행 전에는 결과를 알 수 없으므로 자바 규칙에 따라 int로 연산된다.

따라서 c1 + 1의 결과는 int가 되고, 이를 char 변수에 저장하려고 하면 타입이 달라 컴파일 에러가 발생한다.

char c2 = (char)(c1 + 1); // 정상

즉, 리터럴끼리의 연산은 컴파일러가 미리 계산해 주지만, 변수가 포함된 연산은 int로 처리된다는 점이 핵심이다.