참조 타입
- 배열 타입, 열거 타입, 클래스, 인터페이스
JVM 메모리 사용 영역
메소드 영역
- JVM이 시작할때 생성되고 모든 스레드가 공유하는 영역
- 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 static필드, 상수, 메소드 코드, 생성자코드 등을 분류해 저장
힙 영역
- 객체와 배열이 생성되는 영역
- 여기에 생성된 객체와 배열은 JVM스택 영역의 변수나 다른 객체의 필드에서 참조함. BUT 참조하는 변수나 필드가 없다면 JVM이 Garbage Collector를 실행시켜 자동으로 제거
JVM 스택 영역
- 메소드를 호출할때마다 프레임(frame)을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작 수행함
- 프레임 안에 로컬 변수 스택(stack)이 있어 여기에 메소드에서 사용하는 변수(기본타입변수, 참조타입변수) 저장 & 제거
- 변수가 초기화될때, 즉 최초로 값이 저장될때 로컬 변수 스택에 변수가 저장됨
- 변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거
- 참조 타입 변수는 스택에 힙 영역에 있는 객체의 주소가 저장되고 실제 값을 갖는 객체는 힙 영역에 생성됨
import java.util.Scanner;
public class HelloApp {
public static void main(String[] args) {
//==============================
String name; // 클래스 참조 변수 선언, null로 초기화
Scanner s; // 클래스 참조 변수 선언, null로 초기화
s = new Scanner(System.in); // Scanner객체가 메모리의 heap영역에 생성되고 주소값은 참조 변수에 저장
name = s.next(); // name참조변수는 s에 입력된 문자열의 참조값을 갖고 실제 문자열을 필드 값으로 가짐
String hello = "Hello"; // literal object(리터럴 객체)
System.out.println(hello + name);
//==============================
s.close(); // 객체 소멸 시킴
}
}
new연산자는 클래스로부터 객체를 메모리의 heap영역에 생성하고 객체가 차지하는 메모리의 주소 값 반환
literal object : new연산자를 사용하지 않고 코드에서 직접 입력돼 생성된 객체
+연산자 : 두 문자열 객체를 연결한 새로운 문자열 객체의 참조 값 반환
객체의 사용이 끝나면 객체.close() 메서드로 객체 소멸 시킴
- 클래스형 참조 변수는 명시적으로 초기화하지 않으면 null값으로 초기화됨
참조 변수의 ==, != 연산
- 동일한 객체를 참조하는지 비교
// 서로 다른 객체를 참조하는 두 변수
refVar1 == refVar2 // false
refVar1 != refVar2 // true
NullPointerException
- 객체를 참조하지 않은 상태로 참조변수가 사용될때 발생하는 오류
- 참조 타입 변수가 힙 영역의 객체를 참조하지 않을때 null값 가짐
- null 값도 초기값으로 사용할 수 있으므로 해당 참조변수는 스택영역에 생성됨
- 참조변수가 null을 가질때는 참조 객체가 없어 객체의 필드나 메소드를 사용하려하면 NullPointerException발생
int[] intArr = null;
intArr[0] = 10; // NullPointerException
'Java' 카테고리의 다른 글
Java 기초 문법(8) (0) | 2023.12.20 |
---|---|
Java 기초 문법(7) (1) | 2023.12.20 |
Java 기초 문법(5) (1) | 2023.12.20 |
Java 기초 문법(4) (0) | 2023.12.20 |
Java 기초 문법(3) (0) | 2023.12.20 |