자바부터 다시 하자.
백기선님의 자바 스터디 2020
종류 | 기본값 | 범위 | 크기 |
---|---|---|---|
byte | 0 | -128 ~ 127 | 1 byte(8 bit) |
short | 0 | -32,768 ~ 32,767 | 2 byte(16 bit) |
int | 0 | -2,147,483,648 ~ 2,147,483,647 | 4 byte(32 bit) |
long | 0L | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 8 byte(64 bit) |
float | 0.0f | (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값 | 4 byte(32 bit) |
double | 0.0 || 0.0d | (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값 | 8 byte(64 bit) |
char | '\u0000' | '\u0000' ~ '\uffff'(0 ~ 65,535) | 2 byte(16 bit) |
boolean | FALSE | FALSE,TRUE | 1 byte(8 bit) |
자바 기본형은 총 8개이고, 정수형(byte, short, int, log), 실수형(float, double), 문자형(char), 논리형(boolean)으로 구성돼 있다. null이 존재할 수 없다.
값이 할당될 때 변수의 주소 값에 값이 JVM의 Runtime Data Area 영역 중 Stack영역에 값이 저장된다.
class
, interface
, enum
, array
, String Type
등 기본형을 제외한 모든 타입이며, null이 존재한다.
값이 저장된 주소의 값을 저장한 변수가 JVM stack에 담기고 주소 값은 heap 영역에 담긴다.
상수는 변수처럼 값을 저장할 수 있는 공간이지만, 변수와 달리 한번 값을 저장하면 변경할 수 없다.
final int MAX_VALUE = 100;
// `int MAX_VALUE`가 선언, `MAX_VALUE=100`가 초기화이다.
// 단순 선언 대신 초기화하자. 물론 jdk1.6부터 굳이 그러지 않아도 된다.
// 그래도 상수를 선언함과 동시에 초기화하는 습관을 들이자.
리터럴은 원시값과 같은 데이터 그 자체를 의미한다. 리터럴을 변수나 상수에 담는 것이다.
상수와의 차이는?
리터럴을 유동적으로 사용하기 위해선 변수나 상수 따위의 명칭으로 담아 사용하는 것이고,
상수는 리터럴 값을 변경하지 않고 사용하기 위해 쓰는 것이다.
선언한 변수에 초기값을 넣는 게 초기화이다. 멤버 변수는 초기화를 명시하지 않아도 변수의 타입에 맞는 기본값으로 초기화되지만 지역변수는 사용하기 전에 반드시 초기화가 이뤄져야 한다.
아래는 가장 기본적인 명시적 초기화 explict initialization
이다.
int x = 1000;
Football fb = new Football();
명시적 초기화만으로는 작업이 복잡한 경우 초기화 블럭을 사용한다.
static
키워드로 감싼 블럭이 클래스 초기화이고, 생성자를 사용하는 게 인스턴스 초기화 블럭이다.
이렇게 초기화된 클래스나 인스턴스는 각각 로딩되거나 생성될 때 처음 한 번 된다.
Inheritance
관계에서만 가능class ArrayExample {
public static void main(String[] args) {
//1차원 배열
int[] oneDimensionArrayEx1 = {1, 2, 3, 4, 5};
int[] oneDimensionArrayEx2;
oneDimensionArrayEx2 = new int[10];
//2차원 배열
int[][] twoDimensionArrayEx1 = {{1, 2}, {3, 4}};
int[][] twoDimensionArrayEx2;
twoDimensionArrayEx2 = new int[10][10];
}
}
타입 추론이란?
데이터 타입을 소스코드에 명시하지 않더라도, 컴파일 단계에서 컴파일러가 method 호출 및 선언과 variable 혹은 object 선언을 활용해 실제 타입을 추론하여 값을 할당하는 것
public static <T> boolean hasElement(T[] elements, T element){
for(T e : elements){
if(e.equals(element){
return true;
}
}
return false;
}
⬇️public static boolean hasElement(Object[] elements, Object element){
for(Object e : elements){
if(e.equals(element){
return true;
}
}
return false;
}
Ref. https://www.baeldung.com/java-type-erasure1.5 버전 부터 추가된 Generic 이나 1.8 버전에서 추가된 lamda 에서 타입추론이 사용된다. 그리고 1.10 버전 에서는 이러한 타입추론을 사용하는 var
이라는 Local Variable Type-Inference 추가