Java 원시 데이터 유형
1. 원시 데이터 유형
Java 프로그래밍 언어에는 8가지 기본 데이터 유형이 있다.
Java에 정의된 8개의 기본 요소는 int, byte, short, long, float, double, boolean 및 char이다. 이들은 객체로 간주하지 않고 원시 값을 나타내며 스택에 직접 저장된다.
- 빠른 참조
Type | Size (bits) | Minimum | Maximum | Example |
---|---|---|---|---|
byte | 8 | -2⁷ | 2⁷–1 | byte b = 100; |
short | 16 | -2¹⁵ | 2¹⁵–1 | short s = 30_000; |
int | 32 | -2³¹ | 2³¹–1 | int i = 100_000_000; |
long | 64 | -2⁶³ | 2⁶³–1 | long l = 100_000_000_000_000; |
float | 32 | -2⁻¹⁴⁹ | (2-2⁻²³)·2¹²⁷ | float f = 1.456f; |
double | 64 | -2⁻¹⁰⁷⁴ | (2-2⁻⁵²)·2¹⁰²³ | double f = 1.456789012345678; |
char | 16 | 0 | 2¹⁶–1 | char c = ‘c’; |
boolean | 1 | - | - | boolean b = true; |
2. int
정수라고도 하는 int 유형은 분수가 아닌 다양한 값을 보유한다.
특히 Java는 32비트 메모리를 사용하여 저장합니다. 즉, -2,147,483,648(-2³¹)부터 2,147,483,647(2³¹-1) 까지의 값을 나타낼 수 있다.
Java 8에서는 새로운 특수 도우미 함수를 사용하여 최대 4,294,967,295(2³²-1) 의 부호 없는 정숫값을 저장할 수 있다.
간단히 int를 선언할 수 있다.
1
2
3
int x = 424_242;
int y;
할당 없이 선언된 int의 기본값은 0이다.
변수가 메서드에 정의되어 있으면 값을 할당해야 사용할 수 있다.
int에 대해 모든 표준 산술 연산을 수행할 수 있다. 정수에 대해 이러한 작업을 수행할 때 소수 값이 잘릴 수 있다는 점에 유의해야 한다.
3. byte
byte는 메모리의 8비트만 차지한다는 점을 제외하고는 int와 유사한 기본 데이터 유형이다. 그래서 바이트라고 부르는 이유이다. 메모리 크기가 너무 작아서 바이트는 -128(-2⁷)에서 127(2⁷–1) 사이의 값만 보유할 수 있다.
바이트를 생성할 수 있다.
1
2
3
byte b = 100;
byte empty;
byte의 기본값도 0이다.
4. short
메모리를 절약하고 싶고 바이트가 너무 작으면 둘 사이의 중간 유형인 short를 사용할 수 있다.
16비트 메모리에서는 int 크기의 절반이고 byte 크기의 두 배이다. 가능한 값의 범위는 -32,768(-2¹⁵) ~ 32,767(2¹⁵–1)이다.
short는 다음과 같이 선언된다.
1
2
3
short s = 202_020;
short s;
또한 다른 유형과 유사하게 기본값은 0이다. 모든 표준 산술도 사용할 수 있다.
5. long
long은 int의 형이다. 64비트 메모리에 저장되어 훨씬 더 많은 가능한 값 집합을 보유할 수 있다.
long의 가능한 값은 -9,223,372,036,854,775,808(-2⁶³)에서 9,223,372,036,854,775,807(2⁶³–1) 사이이다.
단순히 하나를 선언할 수 있다.
1
2
3
long l = 1_234_567_890;
long l;
다른 정수 유형과 마찬가지로 기본값도 0이다. int에서 작동하는 long에서 모든 산술을 사용할 수 있다.
6. float
우리는 float type을 사용하여 Java의 기본 분수 수를 나타낸다. 이것은 정밀도가 한 개인 소수이다. 즉, 소수점 6개를 넘으면, 이 숫자는 정확도가 떨어지고 추정치에 가깝다.
대부분의 경우 정밀 손실에 대해서는 신경 쓰지 않는다. 그러나, 우리의 계산이 절대 정밀도를 필요로 한다면(예: 재무 운영, 달 착륙 등) 우리는 이 작업을 위해 설계된 특정 유형을 사용해야 한다. 자세한 내용은 Java 클래스 Big Decimal을 참조한다.
이 유형은 int처럼 32비트 메모리에 저장된다. 그러나 부동 소수점 때문에 범위가 많이 다르다. 양수와 음수를 모두 나타낼 수 있다. 가장 작은 소수는 1.40239846 x 10⁻⁴⁵이고 가장 큰 값은 3.40282347 x 10³⁸이다.
float를 다른 유형과 동일하게 선언한다.
1
2
3
float f = 3.145f;
float f;
그리고 기본값은 0 대신 0.0이다. 또한 float를 정의하기 위해 리터럴 숫자 끝에 f 지정을 추가한다. 그렇지 않으면 10진수 값의 기본 유형이 double이므로 Java에서 오류가 발생한다.
또한 float에 대해 모든 표준 산술 연산을 수행할 수 있다. 그러나 부동 소수점 산술을 정수 산술과 매우 다르게 수행한다는 점에 유의하는 것이 중요하다.
7. double
이름은 그것이 이중 소수라는 사실에서 유래되었다.
64비트 메모리에 저장된다. 이는 float 보다 훨씬 더 넓은 범위의 가능한 숫자를 나타냄을 의미한다.
그러나 float와 동일한 정밀도 제한이 있다. 범위는 4.9406564584124654 x 10⁻³²⁴에서 1.7976931348623157 × 10³⁰⁸이다. 그 범위는 양수 또는 음수일 수도 있다.
double 선언은 다른 숫자 유형과 동일하다.
1
2
3
double d = 3.13457599923384753929348D;
double d;
기본값도 float와 마찬가지로 0.0이다. float와 유사하게 문자 D를 첨부하여 literal을 double로 지정한다.
8. boolean
가장 간단한 기본 데이터 유형은 boolean이다. true 또는 false의 두 가지 값만 포함할 수 있다. 단일 비트에 값을 저장한다.
그러나 편의를 위해 Java는 값을 채우고 단일 바이트에 저장한다.
다음과 같이 부울을 선언한다.
1
2
3
boolean b = true;
boolean b;
값 없이 선언하면 기본값은 false이다. boolean은 프로그램 흐름을 제어하는 초석이다. 부울 연산자를 사용할 수 있다(예: and, or 등).
9. char
문자라고도 하는 char는 유니코드로 인코딩된 문자를 나타내는 16비트 정수이다. 범위는 0에서 65,535까지이다. 유니코드에서 \u0000
에서 \uffff
를 나타낸다.
가능한 모든 유니코드 값 목록은 Unicode Table과 같은 사이트를 확인한다.
다음과 같이 char를 선언한다.
1
2
3
4
5
char c = 'a';
char c = 65;
char c;
변수를 정의할 때 모든 문자 리터럴을 사용할 수 있으며 자동으로 유니코드 인코딩으로 변환된다. 문자 기본값은 \u0000
이다.
10. Overflow
원시 데이터 유형에는 크기 제한이 있다. 하지만 최댓값보다 큰 값을 저장하려고 하면 overflow라는 상황에 부딪힌다.
정수가 overflow되면 최소값으로 롤오버되고 여기서부터 카운트를 시작한다.
Infinity를 반환하여 부동 소수점 번호가 overflow된다. Underflow시 0.0을 반환한다.
다음은 예이다.
1
2
3
4
5
6
7
int i = Integer.MAX_VALUE;
int j = i + 1;
// j will roll over to -2_147_483_648
double d = Double.MAX_VALUE;
double o = d + 1;
// o will be Infinity
Underflow는 최소값보다 작은 값을 저장하는 경우를 제외하고는 동일한 문제이다.
11. Autoboxing
각 기본 데이터 유형에는 랩핑할 수 있는 완전한 Java 클래스 구현도 있다. 예를 들어 Integer 클래스는 int를 래핑할 수 있다. 때때로 원시 유형에서 객체 래퍼로 변환해야 할 필요가 있다(예: 제네릭 과 함께 사용).
다행히도 Java는 이 변환을 자동으로 수행할 수 있다. 우리는 이 과정을 Autoboxing 이라고 부른다. 다음은 예이다.
1
2
3
Character c = 'c';
Integer i = 1;