public static long solution(int a, int b) throws IOException {
long sum = 0;
for (int i = ((a < b) ? a : b); i <= ((a < b) ? b : a); i++) {
sum += i;
}
return sum;
}
long 타입을 반환해야하는 함수이기 때문에 반환할 변수를 long 타입으로 선언했습니다.
하지만, 연산 과정에서 int형 변수 i를 long 타입의 변수에 누적하여 더하고 있습니다.
이 때, int 타입 변수를 long 타입 변수에 더할 수 있는 이유는 int 타입(32bit 정수) 이 long 타입(64비트 정수) 보다 더 작은 범위를 갖기 때문입니다. 이렇게 더 작은 범위의 변수가 더 큰 범위 변수에 연산되어 담기고자 할 때는 데이터 손실 없이 자동 형변환이 이루어집니다.
반대로, 명시적 형변환은 더 큰 데이터 타입이 더 작은 데이터 타입으로 변환될 때 발생합니다. 이 경우 데이터 손실의 위험이 따르기 때문에 개발자가 명시적으로 변환을 지시해야 이루어질 수 있습니다.
long longValue = 1234567890123L;
int intValue = 0;
// 컴파일 오류 발생
// intValue += longValue;
// 개발자가 직접 명시적 형변환 지정
intValue += (int) longValue;
하지만, 데이터 손실의 위험이 따르기 때문에 int 변수를 long 타입으로 변경하여 두 변수의 타입을 맞추는 방법도 있습니다.
long intValue = 42;
long longValue = 100L;
intValue += longValue;
이 방법이 더 안전하며 데이터 손실의 위험이 없습니다. 가능하면 데이터 손실의 위험이 있는 명시적 형변환을 피하고, 적절한 데이터 타입을 사용하는 것이 좋습니다.