기본형 변수는 참조하지 않고 실제 값(리터럴)을 저장하며 컴파일 시점에서 할당 메모리의 크기를 검사합니다.
boolean 1byte true, false
byte 1byte -128 ~ 127
short 2byte -32_768 ~ 32767
int 4byte -2147483648 ~ 2147483647
long 8byte -9223372036854775808 ~ 9223372036854775807
float 4byte 1.4E-45 ~ 3.4028235E38 (근사값)
double 8byte 4.9E-324 ~ 1.7976931348623157E308 (근사값)
char 2byte '\u0000' ~ '\uFFFF'
1, 0.1, 'c'
와 같은 변수에 저장될 수 있는 데이터 자체를 의미합니다. 리터럴 값들은 불변성을 지니며 값은 실제 할당 이 후 변하지 않습니다.
자바에서 각 변수형 별로 리터럴을 표기하는 법은 다음과 같습니다.
0b10
02
2
0x2
2.0F
2.0L
'2'
"2"
상수도 불변성을 지닌다는 관점에서 리터럴과 비슷한 점을 갖고 있습니다. 하지만 상수는 불변성을 지니는 변수라는 점에서 리터럴과 차이를 갖습니다.
한번 초기화된 상수는 이 후에 다시 초기화 할 수 없으며 자바에서는 final
키워드로 상수를 선언합니다.
참조형은 기본형을 제외한 모든 타입을 칭하며 실제 데이터 값이 아닌 객체의 주소값(해시코드값)을 저장하는 변수를 말합니다.
Class
Interface
array
Enumeration
...참조형 변수는 항상 4byte의 같은 크기를 가지며 힙(Heap) 메모리에 저장됩니다. 해당 객체의 해시코드값 혹은 null 값을 저장합니다.
Person man = new Person();
/*
new를 통해 객체를 생성하고 new의 반환값으로 생성된 객체의 해시코드를 받습니다.
그 후 그 주소를 man 참조변수에 저장하게 됩니다.
*/
자바에서는 기본형 타입끼리만 산술 연산 및 논리연산이 가능하며 레퍼런스 타입은 산술연산 및 논리연산을 할 수 없습니다.
예외적으로 ==
연산자를 통해 가르키고 있는 해시코드의 값을 비교할 수 있습니다. 이 때는 참조하고 있는 레퍼런스가 같다면 true
를 반환합니다.
레퍼런스끼리 값 비교가 필요할 경우 Object.equals
메소드를 오버라이딩하여 원하는 값끼리 비교하게 할 수 있습니다.
String.equals(String str2)
⇒ 참조 해시코드가 다르더라도 저장된 문자열 값이 같다면 true
반환대소 비교가 필요하다면 Comparable
인터페이스를 구현하여 compareTo(object O)
메소드를 재정의하여 레퍼런스 간 비교를 할 수 있습니다.
Java에서는 배열또한 참조형으로 사용하며 배열 객체가 저장되어 있는 해시코드를 참조하게 됩니다.
이 때 다중 배열은 해당 배열보다 한단계 낮은 배열의 해시코드를 참조합니다. 또한 직접적으로 배열의 차원 크기만큼 메모리를 할당하지 않기 때문에 다중배열은 물리적으로 정렬되어 있지 않습니다.
int[][] arr = new int[2][];
arr[0] = new int[4];
arr[1] = new int[234];
/*
c언어처럼 물리적으로 2차원 배열을 형성하는게 아닌
참조를 갖는 배열을 만드는 것이므로 각각의 배열은 연속되어 있지 않으며
다른 크기를 가질 수 있음
*/
무야호