[Java]자바의 데이터 타입 - Primitive Type & Type Casting
★ 자바의 Data Type
자바의 데이터 타입은 크게 기본형인 Primitive Type 과 참조형인 Reference Type 으로 구분합니다.
- Primitive Type
data type | size | description | |
정수형 | byte | 1 byte | -128 ~ 127 범위의 정수 |
short | 2 byte | -32,768 ~ 32,767 범위의 정수 | |
int | 4 byte | -2^31 ~ 2^31-1 범위의 정수 | |
long | 8 byte | -2^63 ~ 2^63-1 범위의 정수 | |
실수형 | float | 4 byte | 소수점 7자리까지 정밀도 |
double | 8 byte | 소수점 15자리까지 정밀도 | |
문자형 | char | 2 byte | 문자 한 개 |
논리형 | boolean | 1 byte | true 또는 false |
- Reference Type
참조형 데이터 타입에는 String, Array, Class, Interface, Enum 과 같은 자료형이 있습니다.
★ 정수형
정수형 데이터 타입에는 byte, short, int, long 타입이 있습니다.
public class IntegerType {
public static void main(String[] args) {
byte num_byte = 1;
short num_short = 100;
int num_int = 1000;
long num_long = 10000;
System.out.println(num_byte);
System.out.println(num_short);
System.out.println(num_int);
System.out.println(num_long);
}
}
★ 실수형
실수형 데이터 타입에는 float, double 형이 있습니다.
float 자료형은 4 byte 로 소수점 7자리까지의 정밀도를 갖습니다. 반면 double 은 8 byte 로 소수점 15자리까지의 정밀도를 갖습니다. 때문에 float 형에 소수점 8자리 이상의 실수값을 대입하여도 소수점 7자리까지 그 값을 반올림하여 저장하게 됩니다.
또한 float 자료형을 갖는 변수에 값을 할당 시, 반드시 값 뒤에 f 를 명시해 주어야 float 형이라고 인식하게 됩니다.
f 를 붙이지 않으면 double 형이라고 인식하기 때문에 타입 에러가 발생하게 됩니다. 이러한 이유로 일반적으로 double 형을 사용하게 됩니다.
public class RealNumber {
public static void main(String[] args) {
float num_float = 3.1415926535f;
double num_double = 3.1415926535;
System.out.println(num_float); // 3.1415927
System.out.println(num_double); // 3.1415926535
}
}
★ 문자형
문자형 char 은 문자 한 개를 다룰 수 있는 데이터 타입입니다.
'a' 와 같이 작은 따옴표로 감싸 표현하며, 큰 따옴표로 감싸게 되면 에러가 발생하게 됩니다.
아스키 코드와 유니 코드 표현이 가능합니다.
public class CharType {
public static void main(String[] args) {
char ch1 = 'a';
char ch2 = 97; // 아스키 코드
char ch3 = 0x61; // 유니 코드
System.out.println(ch1); // a
System.out.println(ch2); // a
System.out.println(ch3); // a
}
}
★ 논리형
논리형 boolean 은 true 또는 false 값을 갖는 데이터 타입으로, 변수에 값을 할당할 때 ture, false 또는 조건식을 이용하여 값을 할당할 수 있습니다.
C 언어는 기본적으로 0은 false, 1은 true 로 인식하는 반면 Java 는 1 과 0 을 true/false 로 인식할 수 없기 때문에 이점을 유의하셔야 합니다.
public class BooleanType {
public static void main(String[] args) {
boolean bool1 = true;
boolean bool2 = false;
boolean bool3 = (100 > 1);
// boolean bool4 = 1; // --> 에러!
System.out.println(bool1); // true
System.out.println(bool2); // false
System.out.println(bool3); // true
}
}
★ 형변환 Type Casting
- 형변환
형변환은 변수나 리터럴간 타입을 일치시키기 위해 데이터 타입을 다른 타입으로 변환시키는 것을 말합니다.
형변환은 데이터 타입의 크기와 연관이 있기 때문에 주의해서 사용해야 합니다.
다음 예시 코드를 보면 int 형은 4 byte, short 형은 2 byte 이기 때문에 2 byte 보다 큰 int 형을 short 형에 대입시키는 것은 에러를 발생하게 됩니다.
int a = 10;
short b = a; // 호환되지 않는 타입 에러
short 형은 int 형보다 값의 범위가 작기 때문에 다음과 같이 작성해도 에러가 발생하지 않습니다.
short a = 10;
int b = a;
이와 같이 boolean 을 제외한 나머지 기본형 데이터 타입은 서로 형변환이 가능하며, 컴파일러가 자동으로 형변환을 해주는 규칙은 다음과 같습니다. 이와 반대로 형변환을 해주어야 한다면 형변환 연산자를 이용하여 강제 형변환을 수행해주어야 합니다.
byte(1byte) -> short(2byte), char(2byte) -> int(4byte) -> long(8byte) -> float(4byte) -> double(8byte)
- 강제 형변환
강제 형변환은 형변환하고자 하는 데이터 앞에 타입을 괄호로 감싸 명시해줌으로써 수행됩니다.
다음 예시를 보면 128 을 갖는 int 형 a 의 값을 short 형, byte 형에 각각 형변환하여 할당하고 있습니다.
short 형의 범위는 -2^15 ~ 2^15-1 이기 때문에 128 을 그대로 저장할 수 있지만, byte 형의 범위는 -2^7 ~ 2^7-1 이기 때문에 최댓값인 127을 넘는 값을 저장할 수 없습니다.
때문에 가장 작은 값은 -128 부터 값을 할당하여 강제 형변환이 이루어지게 됩니다.
int a = 128;
short b = (short)a; // 128
byte c = (byte)a; // -128
- 자동 형변환
byte > short, char > int > long > float > double 방향으로 형변환을 수행할 때 형변환 연산자를 명시하지 않고도 컴파일러가 자동으로 형변환을 수행해줍니다. 또한 연산과정에서 자동적으로 발생하는 형변환을 "산술 변환"이라고 합니다.
int m = 80;
double n = m; // int -> double 자동 형변환
double s = 1.0 + m; // 산술 변환
System.out.println(m); // 80
System.out.println(n); // 80.0
System.out.println(s); // 81.0