📍 정수 나눗셈에서 소수점을 얻고 싶다면?
자바에서 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로 처리된다는 점이 핵심이다.
'개발공부 > JAVA의 정석' 카테고리의 다른 글
| chapter 2-1) 변수 variable (0) | 2026.06.05 |
|---|---|
| chapter 2-2) 자주 사용되는 타입 간의 변환 (0) | 2026.06.05 |
| chapter 1) 왜 자바는 main()을 찾을까? JVM과 스프링의 실행 시작점 이해하기 (0) | 2026.06.04 |