[Java] int와 long 타입 간의 곱셈: 오버플로우 문제 해결하기

김하밍·2024년 6월 19일

알고리즘

목록 보기
20/22

문제 상황

프로그래머스 > x만큼 간격이 있는 n개의 숫자
다음과 같은 문제를 풀면서 왜 결과가 예상대로 나오지 않는지 궁금했습니다. 문제는 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 반환하는 것이었습니다.

int x, int i 가 있을 때
x * i 연산을 한 후에 (long) 을 붙여서 타입 변환해주면 안되나?

계산을 먼저 하고 그 결과를 long타입으로 변환하면 계산 과정에서 int타입의 범위를 초과하는 경우 오버플로우가 발생할 수 있습니다. Java에서는 int타입의 범위는 -2,147,483,648 부터 2,147,483,647 까지 입니다. 이 범위를 초과하면 잘못된 결과가 나옵니다.

예를 들어, x가 1,000,000이고 i가 3,000이라면 x * i 는 3,000,000,000이 되어야 하겠지만, int 타입의 범위를 초과하기 때문에 오버플로우가 발생합니다. 이 값이 long으로 변환되더라도 이미 잘못된 값이기 때문에 올바른 연산 방법이 되지 않습니다.

따라서 x를 long으로 먼저 변환한 후 계산을 해야 int타입의 오버플로우 문제를 피할 수 있습니다.

[잘못된 예]

public long[] solution(int x, int n) {
	long[] answer = new long[n];
    
    for (int i = 0; i < n; i++) {
    	answer[i] = (long) x + (x * i);

[오버플로우 문제를 고려하여 수정된 예]

public long[] solution(int x, int n) {
	long[] answer = new long[n];
    
    for (int i = 0; i < n; i++) {
    	answer[i] = x + (long) x * i;

결론

이번에는 int 타입의 오버플로우 문제를 해결하기 위해 long 타입으로 변환하여 계산하는 방법을 알아보았습니다. Java에서 타입 변환의 중요성을 이해하고, 올바른 순서로 계산을 수행하는 것이 얼마나 중요한지 다시 한번 깨달았습니다. 앞으로도 이런 문제를 피하기 위해 데이터 타입의 범위와 특성을 잘 이해하고 코드를 작성해야겠습니다.

profile
나만의 언어로 기록하며 성장하기 !

0개의 댓글