정수 타입
정수 타입은 숫자를 나타내는 타입으로, byte, short, int, long 이 있으며 각각 차지하는 메모리의 양과 나타낼수 있는 숫자의 범위가 다르다.
과거에는 컴퓨터의 성능이 좋지않아 저장할 데이터의 범위에 맞게 사용하였지만 현재는 보통 int만을 사용한다.
타입 | 메모리 | 표현 범위 |
byte | 1byte | -128(-27) ~ 127(27 - 1) |
short | 2byte | -32,768(-215) ~ 32,767(215 - 1) |
int | 4byte | -2,147,483,648(-231) ~ 2,147,483,647(231 - 1) |
long | 8byte | -9,223,372,036,854,775,808(-263) ~ 9,223,372,036,854,775,807(263 - 1) |
byte byteNum = 123;
short shortNum = 12345;
int intNum = 123456789;
long longNum = 12345678910L;
// 각 데이터 타입의 표현 범위에 맞는 값을 할당한다.
// long의 경우 리터럴 마지막에 접미사 L을 붙여준다.
byte byteNum = 130;
short shortNum = 123456;
int intNum = 12345678910;
// 각 데이터 타입의 범위에 벗어난 리터럴을 할당하면 에러가 발생한다.
int intNum = 12_345_678_910;
long longNum = 12_345_678_910L;
// 숫자가 길면 언더바로 구분할 수 있다.
오버플로우와 언더플로우
개발자가 코드를 작성중 실수로 각 타입의 표현 범위를 넘기게 될경우, 표현 범위의 최대값을 넘기면 오버플로우, 최소값을 넘기면 언더플로우가 발생한다.
오버플로우 발생시에는 데이터 타입의 최소값으로 값이 순환, 언더플로우의 경우 반대로 최대값으로 값이 순환된다. 예를 들어 byte 형을 사용하고 이때 최대값 127을 넘겨 128이 될경우 최소값인 -128이되며 -128을 넘겨 -129가 되면 최대값인 127이 된다.
실수 타입
실수 타입은 소수점을 가지는 숫자형 데이터 타입이며 float과 double이 있다.
타입 | 메모리 | 표현 범위 | 정밀도 |
float | 4byte | 음수 : -3.4 * 1038 ~ -1.4 * 10-45 양수 : 1.4 * 10-45 ~ 3.4 * 1038 |
7자리 |
double | 8byte | 음수 : -1.8 * 10308 ~ -4.9 * 10-324 양수 : 4.9 * 10-324 ~ 1.8 * 10308 |
15자리 |
float num1 = 3.14f;
// float형의 경우 접미사 f를 반드시 붙여준다.
double num2 = 3.141592d;
double num2 = 3.141592;
// double형의 경우 접미사 d를 붙여도 안붙여도 상관없다.
논리 타입
논리 타입의 경우 boolean 한가지 뿐이며 오직 true 혹은 false 두가지 값만을 가진다. 단순히 참과 거짓만을 표현하기 때문에 실제로 1bit만을 사용하지만 JVM이 다룰 수 있는 최소 데이터의 단위가 1byte이기 때문에 boolean은 1byte(8bit)의 크기를 가진다.
boolean isTeenager = true;
boolean isAdult = false;
문자 타입
문자 타입 또한 2byte 크기를 가지는 char 한가지 뿐이며 오직 한글자의 문자형 리터럴만을 저장할수 있다. 문자형 타입을 사용할때는 리터럴에 작은 따옴표(' ')로 감싸 주어야한다.
자바는 유니코드를 이용하여 문자를 저장하기 때문에 만약 문자 'A'의 변수를 할당하면 영문자 'A'의 유니코드 숫자값이 저장된다.
char charater1 = 'a';
char charater2 = 'ab'; // 에러 : 단 하나의 문자만 할당할 수 있다.
char charater3 = "a"; // 에러 : 작은 따옴표를 사용해야 한다.
char unicode = 65; // 출력 결과 : A
타입 변환
boolean을 제외한 기본타입 7개는 서로 다른 타입으로 변환할수 있으며 자동 타입 변환과 수동 타입 변환이 있다.
자동 타입 변환
- 바이트 크기가 작은 타입에서 큰 타입으로 변환할 때 (예 : byte → int)
- 덜 정밀한 타입에서 더 정밀한 타입으로 변환할 때 (예 : 정수 → 실수)
아래의 순서도에 따라 자동 변환 될수 있으며 소괄호'()' 안의 숫자는 타입이 가지는 크기를 적어둔 것이다.
여기서 long타입이 float 타입보다 큰값을 저장하는데 long이 더 앞에 있는 이유는 실수 타입은 모든 정수 타입보다 더 정밀하기 때문에 long보다 적은 값을 저장하더라도 float이 더 뒤에 위치한다.
byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)
수동 타입 변환
자동 타입 변환과 달리 차지하는 메모리 용량이 더 큰 타입에서 작은타입으로 변환할때 수동 타입 변환을 사용하며 이를 캐스팅(Casting)이라고 한다.
int intValue = 128;
byte byteValue = (byte)intValue;
// -128 출력
위의 경우 메모리용량이 더큰 int에서 더작은 byte로 수동 변환 해주는 모습이다. 리터럴 앞에 변환해줄 타입을 소괄호와 함께 넣어주면되며 -128이 출력되는것은 오버플로우가 발생하여 나타난 현상이다.
'Java > Java' 카테고리의 다른 글
연산자 (0) | 2023.02.20 |
---|---|
Java의 유용한 메소드들 (0) | 2023.02.20 |
참조 타입(Reference Type) - Java Data Type (0) | 2023.02.19 |
변수와 자바의 데이터 타입 (0) | 2023.02.18 |
Java의 설치 와 특징 (0) | 2023.02.18 |