1. 프리미티브 타입 종류와 값의 범위 그리고 기본값
- 자바에 존재하는 프리미티브 타입은 아래와 같다.
종류 | 범위 | Memory | 기본값 | |
논리형 | boolean | true / false | 1byte | false |
정수형 | byte | -128 ~ 127 | 1byte | 0 |
short | -32768 ~ 32767 | 2byte | 0 | |
int | -2,147,483,648 ~ 2,147,483,647 | 4byte | 0 | |
long | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
8byte | 0L | |
실수형 | float | 1.175494351 E - 38 ~ 3.402823466 E + 38 |
4byte | 0.0F |
double | 2.2250738585072014 E - 308 ~ 1.7976931348623158 E + 308 |
8byte | 0.0 | |
문자형 | char | 0 ~ 65,535 | 2byte | '\u0000' |
- 실제로 출력해보자.
static boolean boolean_default;
static byte byte_default;
static short short_default;
static int int_default;
static long long_default;
static float float_default;
static double double_defualt;
static char char_default;
public static void main(String[] args) {
System.out.println("boolean default : " + boolean_default);
System.out.println("byte default : " + byte_default);
System.out.println("short default : " + short_default);
System.out.println("int default : " + int_default);
System.out.println("long default : " + long_default);
System.out.println("float default : " + float_default);
System.out.println("double default : " + double_defualt);
System.out.println("char default : " + char_default);
System.out.println("char default : " + '\u0000');
}
boolean default : false
byte default : 0
short default : 0
int default : 0
long default : 0
float default : 0.0
double default : 0.0
char default :
char default :
2. 프리미티브 타입과 레퍼런스 타입
- Reference (참조) 라는 뜻을 갖고있다.
- 실제 값이 들어있는 곳 (Heap) 에 대한 주소를 갖고있다는 뜻이다.
- 그림과 코드로 살펴보자.
- 최상위 클래스는 모두 Object이다.
예시 1)
public static void main(String[] args) {
Integer num2 = 10101;
int num = 100;
}
- 위의 코드를 아래의 그림으로 설명해보면
- Integer num2 = 10101;
- Heap에 10101 이 들어있는 Integer 형태의 인스턴스를 생성한 뒤
- 스택 내에서 메모리공간을 할당한 후에, 10101 이 저장된 Heap 의 주소인 0x12345678 을 저장한다.
- int num = 100;
- 스택 내에서 메모리공간을 할당한 뒤, 100을 저장한다.
- Integer num2 = 10101;
- Primitive 형식은 모두 위의 그림처럼 stack 메모리 공간에 값을 바로 할당하며
- 그 이외의 형식 (Reference 형식) 은 Heap 에 할당한다.
예시 2)
public static void main(String[] args) {
Integer num2 = 10101;
Integer num3 = 10101;
System.out.println(num2 == num3); // false
System.out.println(num2.getIntValue() == num3.getIntValue()) // true
}
- num2 == num3 [false]
- Integer num2 와 Integer num3 는 같은 값이 들어있는 어느 주소를 가리키고 있을 테지만
- 둘이 가리키는 주소의 값은 다르기 때문이다. (0x12345678 != 0x56781234)
- num2.getIntValue() == num3.getIntValue() [true]
- 값을 비교하려면 .getIntValue() 를 수행해, 주소에 있는 값을 꺼내와서 비교해야 한다.
Object 클래스가 최상위인지 확인해보자.
- Integer 의 부모 클래스 확인하기
public static void main(String[] args) {
Class<?> type = Integer.class;
while(type.getSuperclass() != null) {
System.out.println(type.getSuperclass().getName());
type = type.getSuperclass();
}
}
결과
java.lang.Number
java.lang.Object
- Primitive type 을 제외한 모든 클래스들은 결국에는 Object 를 출력할 것이다.
'WhiteShip Study' 카테고리의 다른 글
1. JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가? (0) | 2020.12.05 |
---|