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));
}
}
'TIL,일일 회고' 카테고리의 다른 글
[TIL, 일일 회고] 2024.11.18 - 박싱(Boxing)과 언박싱(UnBoxing) (2) | 2024.11.18 |
---|---|
[TIL, 일일 회고] 2024.11.17 - OptionalInt 알아보기 (0) | 2024.11.17 |
[TIL, 일일 회고] 2024.11.15 - STAR 기법이란 무엇일까❓ (0) | 2024.11.15 |
[TIL, 일일 회고] 2024.11.14 - A/B 테스트: 데이터 기반 의사결정의 힘 (0) | 2024.11.14 |
[TIL, 일일 회고] 2024.11.13 - BigInteger 클래스의 mod() 함수 알아보기 (0) | 2024.11.13 |