자바에서 타입(Type)은 변수, 메서드, 객체 등이 가질 수 있는 데이터의 종류를 정의한다. 모든 변수와 표현식은 명확한 데이터 타입을 가지며, 이를 통해 컴파일 타임에서 타입 오류를 방지할 수 있다. 자바의 타입은 크게 두 가지로 나눌 수 있다: 기본형(Primitive Types)과 참조형(Reference Types). 이 글에서는 기본형 타입을 다룬다.
기본형 타입
| 값의 분류 | 기본 타입 |
| 정수 | byte, char, short, int, long |
| 실수 | float, double |
| 논리(true/false) | boolean |
정수 타입
| 타입 | 메모리 크기 | 저장되는 값의 허용 범위 | ||
| byte | 1byte | 8bit | -2^7 ~ (2^7 - 1) | -128 ~ 127 |
| short | 2byte | 16bit | -2^15 ~ (2^15 - 1) | -32,768 ~ 32,767 |
| char | 2byte | 16bit | 0 ~ (2^16 - 1 ) | 0 ~ 65535 (유니코드) |
| int | 4byte | 32bit | -2^31 ~ (2^31 - 1) | -2,147,483,648 ~ 2,147,483,647 |
| long | 8byte | 64bit | -2^63 ~ (2^63 - 1) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
각 타입에 저장되는 값의 허용 범위를 모두 외울 필요는 없지만, 메모리의 할당 크기는 알고 있는 것이 좋다.
다음 예제는 byte 타입 변수에 허용 범위를 초과한 값을 대입했을 경우 컴파일 오류가 발생하는 것을 보여준다.
public class ByteExample {
public static void main(String[] args) {
byte var1 = -128;
byte var2 = 0;
byte var3 = 127;
byte var4 = 128; // 컴파일 에러
System.out.println(var1);
System.out.println(var2);
System.out.println(var3);
System.out.println(var4);
}
}
long 타입은 수치가 큰 데이터를 다루는 프로그램에서 사용된다. 예를 들어 은행이나 과학 분야에서 사용되는 프로그램들이다. 기본적으로 컴파일러는 정수 리터럴을 int 타입 값으로 간주하기 때문에 int 타입의 허용 범위를 초과하는 리터럴은 뒤에 소문자 'l'이나 대문자 'L'을 붙여 long 타입 값임을 컴파일러에게 알려 줘야 한다.
다음 예제는 int 타입 변수에 허용 범위를 초과한 값을 대입했을 경우 컴파일 오류가 발생하는 것을 보여준다.
public class LongExample {
public static void main(String[] arg) {
long var1 = 1000000000000; // 컴파일 에러
long var2 = 1000000000000L; // 허용 범위가 더 넓은 long 타입을 사용한다.
}
}
메모리 크기를 n이라고 할 때, 정수 타입은 다음과 같은 동일한 구조의 2진수로 저장된다.
| 메모리 사용 크기(단위 bit) | ||||||
| n | n-1 | n-2 | ... | 3 | 2 | 1 |
| 부호 bit | 2진수 | |||||
코드에서 프로그래머가 직접 입력한 값을 리터럴(literal)이라고 부르는데, 변수에 대입할 정수 리터럴은 진수에 따라 작성하는 방법이 다르다.
2진수 : 0b 또는 0B로 시작하고 0과 1로 작성
int x = 0b1011; // 10진수 값 = 1x2^3 + 0x2^2 + 1x2^1 + 1x2^0 = 11
int y = 0B10100; // 10진수 값 = 1x2^4 + 0x2^3 + 1x2^2 + 0x2^1 + 0x2^0 = 20
8진수 : 0으로 시작하고 0~7 숫자로 작성
int x = 013; // 10진수 값 = 1x8^1 + 3x8^0 = 11
int y = 0206; // 10진수 값 = 2x8^2 + 0x8^1 + 6x8^0 = 134
10진수 : 소수점이 없는 0~9 숫자로 작성
int x = 12;
int y = 365;
16진수 : 0x 또는 0X로 시작하고 0~9 숫자나 A, B, C, D, E, F 또는 a, b, c, d, e, f로 작성
int x = 0xB3; // 10진수 값 = 11x16^1 + 3x16^0 = 179
int y = 0X2A0F; // 10진수 값 = 2x16^3 + 10x16^2 + 0x16^1 + 15x16^0 = 10767
문자 타입
하나의 문자를 작은 따옴표(')로 감싼 것을 문자 리터럴이라고 한다. 문자 리터럴은 유니코드로 변환되어 저장되는데, 유니코드는 세계 각국의 문자를 0~65535 숫자로 매핑한 국제 표준 규약이다. 자바는 이러한 유니코드를 저장할 수 있도록 char 타입을 제공한다.
char var1 = 'A'; // 'A' 문자와 매핑되는 숫자 : 65로 대입
char var2 = '가'; // '가' 문자와 매핑되는 숫자 : 44032로 대입
유니코드가 정수이므로 char 타입도 정수 타입에 속한다. 그렇기 때문에 char 변수에 작은따옴표로 감싼 문자가 아니라 유니코드 숫자를 직접 대입할 수도 있다.
char var1 = 65; // 10진수 65와 매핑되는 문자 : 'A'
char var2 = 0x0041; // 16진수 0041과 매핑되는 문자 : 'A'
char 타입은 변수에 어떤 문자도 대입하지 않고 단순히 초기화를 할 목적으로 다음과 같이 작은 따옴표(') 두 개를 연달아 붙인 빈문자를 입력하면 컴파일 에러가 발생한다. 이 경우에는 공백(유니코드: 32) 하나를 포함해서 초기화해야 한다.
char var1 = ''; // 컴파일 에러
char var2 = ' ';
문자열 내부에 역슬래쉬(\)가 붙은 문자를 사용할 수 있는데, 이것을 이스케이프 문자라고 한다. 이스케이프 문자를 사용하면 특정 문자를 포함할 수 있다.
| 이스케이프 문자 | 출력값 |
| \" | " |
| \' | ' |
| \\ | \ |
| \u16진수 | 16진수 유니코드에 해당하는 문자 |
| \t | 탭만큼 띄움 |
| \n | 줄바꿈(라인피드) |
| \r | 캐리지 리턴 |
큰 따옴표 3개로 감싸면 이스케이프 하거나 라인피드를 할 필요가 없이 작성된 그대로 문자열로 저장된다.
실수 타입
| 타입 | 메모리 크기 | 저장되는 값의 허용 범위(양수 기준) | 유효 소수 이하 자리 | ||
| float | 4byte | 32bit | 1.4 x 10^-10 ~ 3.4 x 10^38 | 7자리 | |
| double | 8byte | 64bit | 4.9 x 19^-324 ~ 1.8 x 10^308 | 15자리 | |
자바는 IEEE 754 표준에 근거해서 float 타입과 double 타입의 값을 부동 소수점 방식으로 메모리에 저장한다. double 타입은 float 타입보다 지수와 가수 부분의 bit 수가 크게 때문에 더 크고 정밀한 실수를 저장할 수 있다.
| 1bit | 지수 | 가수 |
e 또는 E가 포함된 10의 거듭제곱 리터럴
double x = 5e2; // 5.0 x 10^2 = 500.0
double y = 0.12E-2; // 0.12 x 10^-2 = 0.0012
컴파일러는 실수 리터럴을 기본적으로 double 타입으로 해석한다. float 타입에 대입하고 싶다면 리터럴 뒤에 소문자 'f'나 대문자 'F'를 붙여 컴파일러가 float 타입임을 알 수 있도록 해야 한다.
double var = 3.14;
float var = 3.14f;
다음 예제는 float과 double 타입의 소수 이하 유효 자릿수를 확인한다. double 타입은 float 타입보다 약 2배의 유효 자릿수를 가지기 때문에 보다 정확한 데이터 저장이 가능하다. double이라는 이름도 float 보다 약 2배의 정밀도를 갖는다는 의미에서 붙여진 것이다.
public class FloatDoubleExample {
public static void main(String[] args) {
float var1 = 0.1234567890123456789f;
double var2 = 0.1234567890123456789;
System.out.println("var1: " + var1);
System.out.println("var2: " + var2);
}
}
실행 결과
var1: 0.12345679
var2: 0.12345678901234568
논리 타입
참과 거짓을 의미하는 논리 리터럴은 true와 false이다. 논리 리터럴은 boolean 타입 변수에 대입할 수 있다.
boolean stop = true;
boolean stop = false;
boolean 타입 변수는 주로 두 가지 상태값을 저장할 필요가 있을 경우에 사용되며, 상태값에 따라 조건문과 제어문의 실행 흐름을 변경하는 데 사용된다.
'Language > JAVA' 카테고리의 다른 글
| [JAVA] 산술 연산자 (1) | 2024.09.03 |
|---|---|
| [JAVA] 부호 연산자와 증감 연산자 (0) | 2024.09.03 |
| [JAVA] print 메소드 (0) | 2024.09.03 |
| [JAVA] 자동 타입 변환과 강제 타입 변환 (0) | 2024.09.03 |
| [JAVA] 변수 선언과 초기화 (0) | 2024.09.03 |