자바는 정수, 실수, 논리값을 저장할 수 있는 기본 타입을 제공한다.
자바의 기본 타입은 총 8개이다.
아래의 표 참조
| 구분 | 저장되는 값에 따른 분류 | 타입의 종류 |
| 기본 타입 | 정수 타입 | byte, char, short, int, long |
| 실수 타입 | float, double | |
| 논리 타입 | boolean |
정수 타입
자바에서 정수 타입은 총 5개로, 아래의 표와 같이 메모리 사용 크기와 저장되는 값의 범위가 서로 다르다.
| 타입 | 메모리 사용 크기 | 저장되는 값의 허용 범위 | ||
| byte | 1byte | 8bit | -2⁷ ~ (2⁷ - 1) | -128 ~ 127 |
| short | 2byte | 16bit | -2¹⁵ ~ (2¹⁵ - 1) | -32,768 ~ 32,767 |
| char | 2byte | 16bit | 0 ~ (2¹⁶ - 1) | 0 ~ 65535(유니코드) |
| int | 4byte | 32bit | -2³¹ ~ (2³¹ - 1) | -2,147,483,648 ~ 2,147,483,647 |
| long | 8byte | 64bit | -2⁶³ ~ (2⁶³ - 1) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
각 타입에 저장되는 값의 범위를 외울 필요는 없지만, 메모리 사용 크기 정도는 알고 있는 것이 좋다.
char 타입은 음수 값을 가질 수 없으며, 나머지 정수 타입이 저장할 수 있는 갓ㅂ의 범위는 -2ⁿ⁻¹ ~ (2ⁿ⁻¹ - 1)이다.
여기서 n 은 메모리 bit 수 이다.
정수 타입으로 선언된 변수에는 정수 리터럴을 대입해서 정수를 저장할 수 있다.
정수 리터럴
프로그래머에 의해 직접 입력된 값으 정수 리터럴 이라고 한다. 입력된 리터럴 중에서 자바가 정수로 인식하는 경우는 다음과 같다.
2진수 : 0b 또는 0B로 시작하고 0 과 1 로 구성된다.
0b1011 ➔ 1x2³ + 0x2² + 1x2¹ + 1x2⁰ ➔ 11
0b10100 ➔ 1x2⁴ + 0x2³ + 1x2² + 0x2¹ + 0x2⁰ ➔ 20
8진수 : 0으로 시작하고 0 ~ 7 숫자로 구성된다.
013 ➔ 1x8¹ + 3x8⁰ ➔ 11
0206 ➔ 2x8² + 0x8¹ + 6x8⁰ ➔ 134
10진수 : 소수점이 없는 0 ~ 9 숫자로 구성된다.
12
365
16진수 : 0x 또는 0X 로 시작하고 0 ~ 9 숫자와 A, B, C, D, E, F 또는 a, b, c, d, e, f 로 구성된다.
0xB3 ➔ 11x16¹ + 3x16⁰ ➔ 179
0x2A0F ➔ 2x16³ + 10x16² + 0x16¹ + 15x16⁰ ➔ 10767
다음은 다양한 정수 리터럴을 int 타입 변수에 저장하고 값을 10진수로 출력하는 코드이다.
public static void main(String[] args) {
int var1 = 0b1011; // 2진수
int var2 = 0206; // 8진수
int var3 = 365; // 10진수
int var4 = 0xB3; // 16진수
System.out.println("var1 : " + var1);
System.out.println("var2 : " + var2);
System.out.println("var3 : " + var3);
System.out.println("var4 : " + var4);
}
long 타입은 수치가 큰 데이터를 다루는 프로그램에서 주로 사용하는데, 대표적인 예가 은행이나 과학과 관련된 프로그램들이다.
기본적으로 컴파일러는 정수 리터럴을 int 타입으로 간주한다. 그래서 정수 리터럴이 int 타입의 허용범위 를 초과할 경우,
long 타입임을 컴파일러에게 알려주어야 한다.
방법은 정수 리터럴 뒤에 소문자 l 이나 대문자 L 을 붙이면 된다.
일반적으로 소문자 l 은 숫자 1과 비슷해 혼동하기 쉬우므로 대문자 L을 사용한다.
// long belance = 30000000000;
// 위 처럼 작성하면 컴파일 에러가 발생하므로
// 아래 처럼 적어주어야 한다.
long belance = 30000000000L;
char 타입
하나의 문자를 작은 따옴표(')로 감싼 것을 문자 리터럴 이라고 한다. 문자 리터럴은 유니코드 로 변환되어 저장된다.
유니코드는 세계 각국의 문자를 2byte 로 표현할 수 있는 숫자(0 ~ 65535) 로 매핑한 국제 표준 규약이다.
자바는 이러한 유니코드를 저장할 수 있도록 2byte 크기인 char 타입을 제공한다.
예를 들어 'A', 'B', '가' '각' 문자를 char 변수에 저장할 경우 변수에 저장되는 유니코드 값은 다음과 같다.
char var1 = 'A'; // 유니코드 : 65
char var2 = 'B'; // 유니코드 : 66
char var3 = '가'; // 유니코드 : 44032
char var4 = '각'; // 유니코드 : 44033
유니코드는 정수이므로 char 도 정수 타입에 속한다. 그래서 char 변수에 작은 따옴표(')로 감싼 문자가 아니라,
10진수 또는 16진수 형태로 유니코드를 저장할 수 있다.
예를 들어 문자 'A' 는 10진수로 65 이고, 16진수로는 0x0041 이므로 다음과 같이 char 변수에 직접 저장할 수 있다.
char c = 65; // 10진수
char c = 0x0041; // 16진수
String 타입
작은따옴표(')로 감싼 문자는 char 타입 변수에 저장되어 유니코드로 저장되지만, 큰따옴표(")로 감싼 문자 또는 여러개의 문자들은 유니코드로 변환되지 않는다.
자바에서 큰따옴표(")로 감싼 문자들을 문자열이라고 부른다.
작은따옴표(')와 큰따옴표(")는 컴파일러가 문자 리터럴과 문자열 리터럴을 구별하는 기호로 사용된다.
문자열을 변수에 저장하고 싶다면 다음과 같이 String 타입을 사용해야 한다.
String var1 = "A";
String var2 = "홍길동";
문자열 내부에 역슬래시(\)가 붙은 문자를 사용할 수 있는데 이것을 이스케이프 문자라고 한다.
이스케이프 문자를 사용하면 문자열 내부에 특정 문자를 포함시킬 수 있다. 예를 들어 큰따옴표(")는 문자열 식별 기호인데,
데이터로써 큰따옴표를 사용하고 싶을 때는 이스케이프 문자 \" 를 사용한다.
String str = "나는 \"자바\"를 좋아합니다.";
System.out.println(str)
또한 이스케이프 문자를 사용하면 출력을 제어할 수 있다.
예를 들어 탭만큼(\t) 띄우거나, 개행(한 줄 내림. \n)을 지시할 수 있다.
String str2 = "번호\t나이\t이름"; String str3 = "홍길동\n감자바";
System.out.println(str2); System.out.println(str3);
| 이스케이프 문자 | 출력 용도 |
| \t | 탭만큼 띄움 |
| \n | 줄 바꿈(라인 피드) |
| \r | 캐리지리턴 |
| \" | " 출력 |
| \' | ' 출력 |
| \\ | \ 출력 |
| \u 16진수 | 16진수 유니코드에 해당하는 문자 출력 |
아래의 표는 자주 사용하는 이스케이프 문자를 정리한 표이다.
실수 타입
소수점이 있는 실수 리터럴을 저장할 수 있는 타입에는 float 과 double이 있다.
다음은 float 타입과 double 타입이 저장할 수 있는 메모리 사용 크기와 허용 범위 이다.
| 타입 | 메모리 사용 크기 | 저장되는 값의 허용 범위(양수 기준) | 정밀도(소수점 이하 자리) | |
| float | 4byte | 32bit | (1.4 x 10⁻⁴⁵) ~ (3.4 x 10³⁸) | 7자리 |
| double | 8byte | 64bit | (4.9 x 10⁻³²⁴) ~ (1.8 x 10³⁰⁸) | 15자리 |
자바는 실수 리터럴을 기본적으로 double 타입으로 해석하기 때문에 double 타입 변수에 저장해야 한다.
실수 리터럴을 float 타입 변수에 저장하면 컴파일 에러가 발생한다.
float var1 = 3.14; // 컴파일 에러
double var2 = 3.14;
double var3 = 314e-2;
만약 실수 리터럴을 float 타입으로 저장하고 싶다면 리터럴 뒤에 소문자 f 나 대문자 F 를 붙여 컴파일러가 float 타입임을 알 수 있도록 해야 한다.
float var1 = 3.14; // 컴파일 에러
float var2 = 3.14f;
float var3 = 3E6F;
float 타입과 double 타입이 허용하는 소수점 이하 자리는 각각 7자리, 15자리이다.
double 타입은 float 타입보다 2배 정도 정밀도가 높기 때문에 좀 더 정확한 데이터 저장이 가능하다.
논리 타입
자바는 참과 거짓을 의미하는 논리 리터럴로 ture 와 false를 사용한다.
논리 리터럴은 다음과 같이 1byte 크기의 boolean 타입 변수에 저장할 수 있다.
boolean stop = false;
boolean start = true;
boolean 타입 변수는 주로 두 가지 상태값에 따라 조건문과 제어문의 실행 흐름을 변경하는데 사용한다.