Primitive Type
원시타입 혹은 기본 타입이라 한다.
- 값을 할당할 때 변수의 주소값에 값이 그 자체로 저장되는 Data Type -> 인스턴스 생성을 하지 않는다.
- Stack 영역에 저장된다.
- Primitive를 Object로 감싸는 Wrapper Class 제공
정수타입
- byte 8bit
- short 16bit
- int 32bit
- long 64bit
실수타입
- float 32bit
- double 64bit
논리타입
- boolean 8bit
Type Conversion
- Widening = int -> long 가능
- Narrowing = int -> byte 불가능. 다만 리터럴 value를 직접 넣으면 범위에 맞는다는 가정하에 가능하다. 혹은 강제 형번환을 사용한다.
Reference Type
- 실제 값이 저장되어 있는 곳의 위치를 저장한 값
- heap 영역에 할당되며 Reference type의 변수 주소 값에는 값이 아닌 heap 영역에 할당된 주소가 저장된다.
int a = 10;
fload b = 19.2;
Car c = new Car("Lexus");
Primitive type은 자바에 의해 이미 정의되어 있고 개발자가 추가적으로 정의할 수 없으며
Reference Type은 개발자가 정의할 수 있다.
== 비교
Primitive에서는 값을 비교하지만
Reference Type에서는 참조 주소를 비교한다.
Primitive == Reference 비교시엔 값을 비교
Person p1 = new Person("Sam");
Person p2 = p1;
p1.name = "Park";
System.out.println(p1.name); // park
System.out.println(p2.name); // park
변수에 실제 값이 아닌 주소값이 저장된 -> Person instance가 공유된다. -> 얕은 복사 -> 하나의 인스턴스가 변경되면 나머지도 영향을 받게된다.
위를 방지하기 위해
1. 새로운 인스턴스 생성
2. 깊은 복사
- 깊은 복사를 사용할 Class에 implements Clonable 추가, clone 함수 재정의
Class Person implements Clonable {
public Person clone() throws CloneNotSupportedException{
return (Person)super.clone();
}
String name;
public Person(String name){
this.name = name;
}
}
리터럴
- Data 그 자체 -> 값 표현 방식에 대해서 각 프로그래밍 언어의 컴파일러 혹은 인터프리터가 해석하는 방식의 명세이다
- 소스코드 내에서 직접 입력된 값
- 정수, 문자, 논리 리터럴
- 변수에 넣지만 변하지 않는 데이터
- 메소드 영역에 저장된다
int i = 2000; // 2000 자체가 하나의 리터럴
Member 객체의 클래스 필드 name
- Member 객체 생성 뒤, 인스턴스에 값을 넣을때 new Member();를 사용하는데 이는 리터럴이 아니다.
- new Member()의 값은 언제든 변경이 가능하기 때문
정수 리터럴
실수 리터럴
문자 리터럴
문자열 리터럴
논리 리터럴
변수 선언과 초기화
- 값을 다룰때, 혹은 여러번 사용하거나 값에 의미를 부여하는것
- Type은 변수에 저장되는 값의 종류, 변수이름은 메모리 주소에 붙여진 이름이다.
- Stack 영역에 메모리가 할당된다.
- 인스턴스 변수: 인스턴스 생성시마다 새로운 저장공간 할당. 클래스 내에서 선언
- 클래스 변수: 클래스가 메모리에 올라갈 떄 생성. Static 사용
- 지역 변수: 메소드 안에서 선언한 변수이며 선언만 하면 아무 값도 없는 상태이다.
int var1; //변수선언 후
var1 = 0; // 리터럴 입력(초기화)
int var2 = var1; //같은 타입 변수 입력
int var3 = 0; // 선언 동시 초기화
//참조타입은 new 사용해 초기화
List<Integer> a = new ArrayList<Integer>();
List<Integer> b = a;
Block 초기화
일반 초기화 Block - Class가 new를 통해 인스턴스 생성시 초기화
Static 초기화 Block - Jvm이 ClassLoader로 로딩 시점에 초기화
변수 스코프, 라이프타임
- Scope = 사용 범위
생명주기
- 인스턴스 변수 -> 객체 생성시 변수 생성. 인스턴스는 참조가 없을떄 GC가 처리. 인스턴스 변수 역시 소멸
- 매개변수 -> 메소드 호출시 생성되고 메소드 종료시 소멸
- 지역 변수 -> {}
- 클래스 변수(정적변수)static -> 클래스 첫 호출시 생성, Java Application 종료시 소멸
배열
- 원시타입 혹은 참조타입으로 구성된 특별한 객체
- 0에서부터 시작하며 명시적으로 사이즈 결정이 가능하다
- 배열 역시 참조타입 -> 객체
- 배열 타입은 Class가 아니다. 하지만 배열의 instance들은 Object
- 즉 배열은 Clonable interface(객체 자신의 메모리를 복하)를 implement한다.
- 또한 Serializable을 구현한다. 즉 직렬화가 가능하다.
- 자바 내부의 object나 data를 외부에서 사용하도록 바이트 형태로 변환