자바 데이터 타입
자바 언어는 다음과 총 9개 타입의 데이터를 다룰 수 있습니다.
기본 타입(basic type): 8개
- boolean
- char
- byte
- short
- int
- long
- float
- double
레퍼런스 타입(reference type): 1개
레퍼런스 타입은 한 가지이지만 용도는 다음과 같이 3가지입니다.
- 배열에 대한 레퍼런스
- 클래스(class)에 대한 레퍼런스
- 인터페이스(interface)에 대한 레퍼런스
자바의 기본 타입
자바의 기본 타입과 메모리 공간, 데이터 값의 범위를 보여줍니다.
정수를 저장하는 타입은 byte, short, int, long의 4개이고, 실수는 float, double의 두 타입을 사용합니다.
타입마다 크기가 다르기 때문에 다르기 때문에 다루는 값의 범위에 따라 적절한 타입을 선택해야 합니다.
자바에서 영어든 한글이든 문자 하나는 2바이트의 유니코드(Unicode)로 저장됩니다.
자바에서 문자를 나타내는 char 타입은 크기가 2바이트입니다.
한편, 문자열은 자바의 기본 타입에 속하지 않기 때문에, 다음과 같이 자바 라이브러리에서 제공하는 String 클래스를 이용합니다.
String strName = "Chae";

문자열
자바에서 문자열은 기본 타입에 속하지 않으며, JDK에서 제공하는 String 클래스를 이용합니다.
String toolName = "JDK"
자바에서는 문자열과 기본 타입의 + 연산이 실행되면, 기본 타입의 값이 문자열로 바뀌고 두 문자열이 연결된 새로운 문자열이 생성됩니다.
toolName + 1.8 -> "JDK1.8"
"(" + 3 + "," + 5 + ")" -> "(3, 5)"
System.out.println(toolName + "이 출시됨"); // "JDK1.8이 출시됨" 출력
변수와 선언
데이터를 저장하는 공간입니다.
변수를 선언하면 타입 크기의 메모리가 할당되며, 프로그램은 실행 중에 값을 쓰고 읽는 공간으로 사용합니다.
변수 선언
데이터의 타입과 이름으로 변수를 선언합니다.

price라는 이름의 정수 타입 변수 선언을 보여줍니다.
같은 타입의 변수를 여러 개 선언하려면 다음과 같이 콤마로 분리하면 된다.
char c1, c2, c3; // 3개의 문자 변수 c1, c2, c3 선언
변수의 선언과 동시에 초기화
변수 선언과 동시에 초기값을 지정할 수 있습니다.
int radius = 10;
char c1 = 'a', c2 = 'b', c3 = 'c';
double weight = 75.56;
변수 읽기와 저장
변수를 선언한 후에는 다음과 같이 변수에 값을 저장하고 읽을 수 있습니다.
radius = 10 * 5; // 변수 radius에 10 X 5의 결과 50 저장
c1 = 'r'; // 변수 c에 문자 'r' 저장
weight = weight + 5.0; // 변수 weight의 값을 읽고 5.0을 더해 weight에 다시 저장
리터럴(literal)
프로그램에 직접 표현한 값을 말합니다. 정수, 실수, 문자, 논리, 문자열 타입 모두 리터럴이 있습니다.
34, 42.195, '%', true, "hello"
정수 리터럴
정수 리터럴은 4가지 유형이 있으며 변수와 함께 사용할 수 있습니다.
| 유형 | 설명 | 사례 |
| 10진수 | 0으로 시작하지 않는 수 | 15 -> 10진수 15 |
| 8진수 | 0으로 시작하는 수 | 015 -> 십진수 13(1x8+5=13) |
| 16진수 | 0x로 시작하는 수 | 0x15 -> 십진수 21(1x16+5=21) |
| 2진수 | 0b로 시작하는 수 | 0b0101 -> 십진수 5 |
long g = 24L; // 24L은 24l과 동일
실수 리터럴
소수점 형태나 지수(exponent) 형태로 다음과 같이 실수를 표현한 값입니다.
12. 12.0 .1234, 1234E-4
실수 리터럴은 double 타입으로 자동 처리되며, 변수와 함께 쓸 수 있습니다.
double d = 0.1234;
double e = 1234E-4; // 1234E-4 = 1234x10-4이므로 0.1234와 동일
숫자 뒤에 f나 F를 붙이면 float, d나 D를 붙이면 double 타입으로 강제 변환할 수 있습니다.
float f = 0.1234f; // f = 0.1234로 하면 컴파일 오류
double w = .1234D; // .1234와 .1234는 동일
문자 리터럴
단일 인용부호('')로 문자를 표현하거나 \u 다음에 문자의 유니코드 값을 사용하여 표현합니다.
'w', 'A', '가', '*', '3', '글', \u0041
char a = 'A';
char b = '글';
char c = \u0041; // 문자 'A'와 유니코드 값(0041) 사용
char d = '\uae00; // 문자 '글'의 유니코드 값(ae00) 사용
특수문자 리터럴도 있다. 백슬래시(\) 다음에 특수 기호를 붙여서 표현합니다.
특수 문자를 이스케이프 시퀀스(escape sequence)라고도 하며 그 종류는 다음 표와 같습니다.
| 종류 | 의미 | 종류 | 의미 |
| '\b' | 백스페이스(backspace) | '\r' | 캐리지 리턴(carriage return) |
| '\t' | 탭(tab) | '\"' | 이중 인용부호(double quote) |
| '\n' | 라인피드(line feed) | '\'' | 단일 인용부호(single quote) |
| '\f' | 폼 피드(form feed) | '\\' | 백슬래시(backslash) |
논리 리터럴과 boolean 타입
논리 리터럴은 true, false 두 개 밖에 없으며, boolean 타입의 변수에 직접 치환하거나 조건문에 사용합니다.
boolean a = true;
boolean b = 10 > 0; // 10 > 0가 참이므로 b 값은 true
boolean c = 1; // 타입 불일치 오류. 자바에서 숫자를 참, 거짓으로 사용 불가
while (true) {
... // 자바에서 무한 루프. while(1)로 하면 안 됨
}
Tip 기본 타입 이외의 리터럴
자바에서 기본 타입 리터럴 외에 자주 사용되는 다음 2가지 리터럴이 있습니다.
1. null 리터럴
null은 기본 타입에 사용될 수 없고, 객체 레퍼런스에 대입합니다.
int n = null; // 오류. 기본 타입에 null 값을 지정할 수 없다.
String str = null; // 정상
2. 문자열(string) 리터럴
문자열 리터럴은 "Hello"와 같이 이중 인용부호로 표현하며, 간단히 문자열이라고도 합니다.
"Good", "Morning", "자바", "3.19", "26", "a"
자바에서 문자열 리터럴을 포함하여 모든 문자열은 String 클래스의 객체입니다. 그러므로 문자열 리터럴은 다음과 같이 String 객체에 저장합니다.
String str = "Good";
Tip Java 10부터 var 키워드를 사용하면 변수 타입 생략
Java 10부터 지역 변수를 선언할 때, 변수의 타입 대신 var 키워드를 사용할 수 있습니다.
var 키워드를 사용하면 다음과 같이 변수 선언이 간편합니다.
var price = 200; // price는 int 타입으로 결정
var name = "Chae"; // name은 String 타입으로 결정
var pi = 3.14; // pi는 double 타입으로 결정
var point = new Point(); // point는 Point 타입으로 결정
var v = new Vector<Integer>(); // v는 Vector<integer> 타입으로 결정
하지만, 변수 선언문에 초깃값이 주어지지 않으면 다음과 같이 오류가 발생합니다.
var name; // 컴파일 오류. 변수 name의 타입을 추론할 수 없음
또한, var의 사용은 지역 변수에만 한정됩니다.
상수
상수를 만드는 방법은 변수 선언 시 final 키워드를 사용하면 됩니다. 상수는 변수와 달리 실행 중에 값이 바뀔 수도 없습니다.

PI = 2.3; // 컴파일 오류
변수, 리터럴 상수 활용
public class CircleArea {
public static void main(String[] args) {
final double PI = 3.14;// 원주율을 상수로 선언
double radius = 10.0; // 원의 반지름
double circleArea = radius * radius * PI; // 원의 면적 계산
// 원의 면적을 화면에 출력한다.
System.out.println("원의 면적 = " + circleArea);
}
}
실행 결과
원의 면적 = 314.0
타입 변환
변수나 상수 혹은 리터럴의 타입을 다른 타입으로 바꾸는 것을 말합니다.
자동 타입 변환
다음과 같이 치환문(=)이나 수식 내에서 타입이 일치하지 않을 때, 컴파일러는 오류 대신 작은 타입을 큰 타입으로 자동 변환합니다.
long m = 25; // 리터럴 25는 int 타입. 25가 long 타입으로 자동 변환
double d = 3.14 * 10; // 실수 연산을 하기 위해 10이 10.0으로 자동 변환
강제 타입 변환
강제로 타입 변환을 지시하는 경우입니다.
int n = 300;
byte b = n; // 컴파일 오류. int 타입은 byte 타입으로 자동 변환 안 됨
큰 타입의 값을 작은 타입의 값을 작은 타입의 값으로 변환할 때, 컴파일러는 자동 변환 대신 컴파일 오류를 발생시킵니다.
타입 변환을 원한다면, 다음과 같이 () 안에 타입을 명시하여 강제 타입 변환을 지시해야 합니다.
btye b = (byte)n; // n을 byte 타입으로 강제 변환. b = 44
하지만, 강제 변환을 하면 컴파일 오류가 발생하지 않을 뿐 데이터 손실이 발생합니다.
double d = 1.9;
int n = (int)d; // 강제 타입 변환으로 n은 1이 됨.
강제 타입 변환을 캐스팅(casting)이라고도 부른다.
타입 변환
public class TypeConversion {
public static void main(String[] args) {
byte b = 127;
int i = 100;
System.out.println(b + i); // b가 int 타입으로 자동 변환
System.out.println(10 / 4); // 정수 나누기이므로 결과는 2
System.out.println(10.0 / 4); // 4가 4.0으로 자동 변환 / 실수 나누기이므로 결과는 2.5
System.out.println((char) 0x12340041); // char로 변환된 결과 0x0041로서 문자 'A'
System.out.println((byte) (b + i)); // b + i는 227, 16진수 0xE3, 즉 -29
System.out.println((int) 2.9 + 1.8);
System.out.println((int) (2.9 + 1.8));
System.out.println((int) 2.9 + (int) 1.8);
}
}
실행 결과
227
2
2.5
A
-29
3.8
4
3