➡️ primitive Type이란?
👉 프리미티브 타입 종류
➡️ Reference Type이란?
public static void main(String args[]){
Car car = new Car(vendor:"kia", price: 100);
}
예를 들어, 위와 같이 Car를 인스턴스화 시키면 Heap영역에 vendor가 "kia"이고 price가 100인 객체가 생성되고 car 변수는 단순히 어떠한 값을 저장하고 있는 것이 아니라 Heap영역에 저장된 객체의 주소가 저장된다.
리터럴은 변수나 상수에 저장되는 값 그 자체를 의미한다.
int a = 10 에서 10이 바로 리터럴이다.
즉, 123, 3.14, "ABC"와 같은 값들을 리터럴이라고 하는데 본래 이러한 값들은 상수라 부르지만 프로그래밍에서는 상수를 "값을 한 번 저장하면 변경할 수 없는 저장공간"으로 정의했기 때문에 이와 구분하기 위해 리터럴이라는 용여를 사용한다.

String str = "hello"; // String constant pool에 저장
String str2 = "hello"; // String constant pool에서 재사용
String str3 = new ("hello"); // 별도의 Heap 메모리에 저장
System.out.println(str == str2); // true (같은 객체를 재사용하기 때문에)
System.out.println(str == str3); // false
System.out.println(str.equals(str3)); // true
❓ Declaration
❓ Initialization?
Error:(10, 28) java: variable a might not have been initialized와 같은 컴파일 에러코드가 나온다. 그러므로 변수는 선언 후에 꼭 초기화를 해야한다!!스코프는 해당 변수를 사용할 수 있는 영역 범위이고, 라이프타임은 해당 변수가 언제까지 메모리에 살아있는지 의미한다.
public class scope_and_lifetime {
int num1, num2; //Instance Variables
static int result; //Class Variable
int add(int a, int b){ //Local Variables
num1 = a;
num2 = b;
return a+b;
}
}
👉 인스턴스 변수
클래스 안에서 선언되어있고, 어떠한 method나 block안에서 선언되지 않은 변수
👉 클래스 변수
클래스 안에서 선언되어있고, 어떠한 메서드나 블럭안에서 선언되지 않았으며 static 키워드가 포함되어 선언된 변수
클래스 변수는 항상 인스턴스 변수보다 먼저 생성 및 초기화됨
👉 지역변수
인스턴스 변수, 클래스 변수가 아닌 모든 변수
변수 또는 상수의 타입을 다른 타입으로 변환하는 것을 의미한다.
double value = 123.456;
int score = (int)value;
System.out.println(value == 123.456); // true
위 코드에서 value는 변환되지 않고, 변환된 결과값만 사용한다.
byte b = (byte)10000; // byte의 표현 범위는 -128 ~ 127
System.out.println(b); // 출력: 16
byte a = 10;
int b = a; // 자동 형변환
System.out.println(b); // 출력: 10
더 큰 크기의 자료형을 더 작은 크기의 자료형으로 변환하는 것을 의미한다. 이 경우 데이터 손실이나 변형이 발생할 수 있다.
더 작은 크기의 자료형을 더 큰 크기의 자료형으로 변환하는 것을 의미한다. 데이터 손실이나 변형이 발생하지 않으므로, 명시적인 형변환 없이 자동으로 변환된다.
기본형과 달리 크기 개념보다는 상속 관계에 따라 자동 변한(업캐스팅)과 명시적변환(다운 캐스팅)으로 나뉜다.
class Parent {}
class Child extends Parent {}
Child child = new Child();
Parent parent = child; // 자동 형변환
💡 생각해보면 자식클래스는 부모클래스의 필드나 메소드를 물려받기 때문에 자식 클래스 타입의 객체를 부모 클래스 타입으로 바꾼다고해서 데이터의 손실이나 변형이 일어나지 않는 것은 당연하다.
Parent parent = new Child();
Child child = (Child)parent; // 명시적 형변환
1) 배열 선언
int[] arr1; / int arr2[]; 처럼 변수명 앞이나 뒤에[]를 붙여 선언
2) 배열 생성
new 연산자를 사용하여 생성하며, 배열의 타입과 길이를 지정하면 메모리에 해당 길이만큼 영역이 확보 타입 추론이란 데이터 타입을 소스코드에 명시하지 않아도, 컴파일 단계에서 컴파일러가 타입을 유추해 정해주는 것이다.
뒤에서 다룰 1.5버전 부터 추가된 Generic이나 자바 8 버전에서 추가된 lamda에서 타입추론이 사용된다. 자바 10에서는 이러한 타입추론을 사용하는 var 이라는 Local Variable Type-Inference 가 추가되었다.
var a = "hello"; // String a = "hello";
var b = 10; // int b = 10;