728x90

개요

프로그래밍에서 숫자를 다룰 때 정수형 자료형의 범위초과하지 않도록 자료형을 선택하는 것은 매우 중요합니다.

 

Java에서는 기본적으로 int, long, 그리고 BigInteger를 제공하며, 각 자료형의 사용 한계를 이해하면 더 안정적인 프로그램을 작성할 수 있습니다.

 

코딩테스트를 준비하다 보면 문제의 조건에 따라 자료형이 달라집니다. 이번 포스팅에서는 각 자료형의 범위에 대해 정리하여 더 안정적인 프로그램을 작성할 수 있도록 하고자 합니다.

 

int 자료형

int smallNumber = 2_000_000_000; // 가능
int tooBigNumber = 3_000_000_000; // 오류: 값이 범위를 초과

 

범위

 

  • 최솟값: -2^31 ≈ -2,147,483,648
  • 최댓값: 2^31 - 1 ≈ 2,147,483,647

용도

 

  • 대체로 작은 값, 예를 들어 인덱스 값, 작은 계산 결과, 배열의 크기 등을 표현하는 데 적합합니다.
  • 32자리 이진수까지 표현 가능
int ➡️ 31자리 이하의 이진수 또는 10자리 이하의 십진수를 다룰때.

 

 

long 자료형

long largeNumber = 3_000_000_000L; // 가능
long tooLargeNumber = 10_000_000_000_000_000_000L; // 오류: 범위를 초과

 

범위

  • 최솟값: -2^63 ≈ -9,223,372,036,854,775,808
  • 최댓값: 2^63 - 1 ≈ 9,223,372,036,854,775,807

용도

  • 큰 숫자, 예를 들어 시간 스탬프(밀리초 단위), 큰 배열 인덱스, 고정된 범위 내에서 큰 정수 연산에 적합합니다.
  • 64자리 이진수까지 표현 가능 (약 18자리 십진수까지 안전).
long ➡️ 63자리 이하의 이진수 또는 19자리 이하의 십진수를 다룰 때.

 

 

 

BigInteger

import java.math.BigInteger;

BigInteger bigNumber = new BigInteger("1000000000000000000000000000000000000");
BigInteger anotherBigNumber = bigNumber.add(new BigInteger("1")); // + 연산 대신 메서드 사용

 

범위

  • 제한 없음 (메모리에 의존)
  • 80자리 이진수, 1000자리 십진수 등 매우 큰 수를 표현할 때 필요.

용도

  • 매우 큰 숫자, 예를 들어 암호화 계산, 매우 긴 자리수를 다루는 경우, 범위를 알 수 없는 계산.

주의

 

  • BigInteger는 불변 객체로, 모든 연산에서 새로운 객체를 생성하므로 성능이 상대적으로 느립니다.
  • +, - 연산자를 지원하지 않으므로 메서드(add, subtract 등)를 사용해야 합니다.

 

BigInteger ➡️ 64자리 이상의 이진수 또는 20자리 이상의 십진수를 다룰 때 적합.

 

예시

"백준 - 이진수 덧셈" 문제에서 요구사항에 따라 각 이진수의 길이가 최대 80자리라고 명시되어 있으므로, 이를 처리하기 위해서는 BigInteger를 사용해야 합니다. 

 

80자리 이진수의 최대값

  • 최대값은 2^80 - 1 ≈ 1.2 × 10^24으로, 약 24자리 십진수에 해당합니다.
  • int: 최대값 2^31 - 1 ≈ 21억으로, 80자리 이진수를 표현할 수 없음.
  • long: 최대값 2^63 - 1 ≈ 9.2 × 10^18으로, 80자리 이진수를 표현할 수 없음.
  • BigInteger: 범위 제한이 없으므로 적합.

 

80자리 이진수는 long 타입으로도 표현할 수 없기 때문에 BigInteger를 사용해야 합니다.

 

public class BOJ1252 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer token = new StringTokenizer(br.readLine());

        BigInteger A = new BigInteger(token.nextToken(), 2);
        BigInteger B = new BigInteger(token.nextToken(), 2);

        BigInteger sum = A.add(B);

        System.out.println(sum.toString(2));
    }
}