기본형과 참조형으로 나뉘어진다.
기본형은 총 8개다 : byte, short, int, long, float, double, char, boolean
나머지는 전부 참조형이며, class의 이름을 활용해 선언된다.
기본형의 타입은 선언시 사용한 이름이다.
참조형의 타입은 선언시 사용된 class의 이름이다.
기본형은 값 자체가 저장되어 있다.
참조형은 주소값이나 null이 저장되어 있다.
주소값은 JVM이 32bit 기반이면 4byte, 64bit 기반이면 8byte다.
final을 사용해서 선언. final int MAX_BUDGET = 5000;
final int BASE_WIDTH = 20;
final int BASE_HEIGHT = 10;
int newFieldArea = BASE_WIDTH * BASE_HEIGHT;
constant라고 부르지만 Java에선 앞에 소개한 의미로 이미 쓰여서 이 이름을 가지게 됨.long인 literal을 만들거면 L/l을 숫자 뒤에 붙인다. long i = 1L;
float냐 double이냐에 따라 접미사 f나 d를 숫자 뒤에 붙인다. float i = 1.0f;
double j = 1.0d;
0b, 0, 0x/0X을 숫자 앞에 붙이면 된다.int octNum = 010; // 8
int hexNum = 0x10; //16
int binNum = 0b10; //2
_을 넣어 숫자 구별을 할 수 있도록 해준다.long a = 100_000_000; //100000000
접미사가 없는 정수는 int literal, 접미사가 없는 실수는 double literal로 취급한다.
단 byte, short literal을 위한 접미사는 없어서, int literal을 사용한다.
short a = 1; //OK
byte b = 2; //OK
byte c = 384; //Overflow(Gives Error)
e를 활용double a = 3.0e8;
p를 쓰면 된다. 이때 p는 2의 제곱을 나타낸다는 점 참고.double 0x0.2p-1; //0.0625
기본적으로 변수 타입이랑 같은 타입의 literal을 저장해야 한다.
단, 숫자의 경우 변수의 타입보다 작은 범위를 나타내는 타입의 literal이 들어가는 것은 상관이 없다.
double d = 3.14f; //OK
float f = 3.14d; //Error
'로, 문자열은 "로 감싼다.char a = 'J';
String b = "Jet";
char a = ''; //error
String b = ""; //OK
char a = 'ab'; //error
문자열은 사실 클래스다. 이 때문에 실제로 위의 String b의 경우 사실 참조형 변수다. 참조형은 주소값으로 초기화가 되어야 하지만 String은 특별히 위와 같이 할당하는 것도 허용해준다는 점 참고.
문자열끼리 덧셈시 둘을 concatenate한다.
String anme = "My" + "Love"; //MyLove
덧셈의 피연산자 중 하나만 String인 경우, 다른 하나를 String으로 변환 후 더한다. 나오는 결과도 String이다.
숫자와 문자열을 더할 경우 숫자의 십진법상 표기가 그대로 String으로 변환되고 더해진다. e나 8, 16진법 등은 다 10진법에 맞게 변환되고 String으로 변환된다.
String a = 10e1 + "hi"; //10hi
boolean과 문자열을 더할 경우 true였으면 "true"와 같은 형태로 변환. 참조형의 경우 주소값 자체가 String이 되며 null은 "null"이 된다.String a = true + "hi"; //truehi
Java의 char은 C와 다르게 16bit이며, 기본적으로 숫자 취급이 아니라는 점에 유의하자. 참고로 Java의 byte는 C의 char처럼 8bit이면서 숫자로 표현이 되지만, C랑 다르게 문자로 취급이 안된다.
Java의 char이 16bit인 이유는 유니코드 전체를 저장할 수 있도록 하기 위해서다.
Java의 char은 숫자로 변환이 가능하지만, C의 unsigned short랑 같은 범위를 가진다. C의 short랑 같은 범위를 가지는 Java의 숫자 type은 short이다.
char 간의 덧셈은 정수간의 덧셈으로 취급된다.
System.out.println('A'+'B'); //131
char과 정수간의 덧셈은 정수간의 덧셈으로 취급된다.System.out.println('1' + 2); //51
char과 String간의 덧셈은 String간의 덧셈으로 취급된다. char이 문자가 하나인 String으로 취급된다.System.out.println('I' + " love C?"); //I love C