1. 데이터 타입 분류
기본 타입 : 정수, 실수, 문자, 논리 리터럴을 저장하는 타입 (실제 값 저장)
참조 타입 : 객체(Object)의 번지를 참조(저장)하는 타입 (메모리 번지값을 통해 객체를 참조한다.)
기본 타입
- 정수 타입 : byte, short, char, int, long
- 실수 타입 : float, double
- 논리 타입 : boolean
참조 타입
- 문자열, 배열, 열거, 클래스, 인터페이스
ex)
// 기본 타입 변수
int age = 25;
double price = 100.5;
// 참조 타입 변수
String name = "케피";
String hobby = "영화";
변수는 스택(Stack) 영역에 생성, 객체는 힙(Heap) 영역에 생성된다.
스택 영역 | 힙 영역 |
age : 25 price : 100.5 name : 15 번지 hobby : 254 번지 |
15 번지 : "케피" 254 번지 : "영화" |
기본 타입 변수인 age와 price는 값을 직접 저장하고 있지만,
참조 타입 변수(String 클래스)인 name 과 hobby는 힙 영역의 String 객체의 주소 값을 가진다.
2. 메모리 사용 영역
- JVM (자바 가상 머신) 이 사용하는 메모리 영역 (Runtime Data Area)
- java.exe로 JVM이 시작되면 운영체제에게서 할당 받은 메모리 영역을 세부 영역으로 구분해서 사용한다.
메소드 영역
- 코드에서 사용되는 클래스(.class) 들을 로더로 읽어서 클래스별로
런타임 상수풀, 필드 데이터, 메소드 데이터, 메소드 코드, 생성자 코드 등으로 분류해서 저장
- 메소드 영역은 JVM이 시작할 때 생성, 모든 스레드가 공유
힙 영역
- 객체와 배열이 생성되는 영역, 생성된 객체는 스택 영역의 변수나 다른 객체 필드에서 참조한다.
- 참조하는 변수나 필드가 없다면, 의미 없는 객체(쓰레기)로 분류되어
가비지 컬렉터가 자동으로 제거한다. (객체를 직접 제거하는 방법 제공하지 않음)
스택 영역
- 각 스레드마다 하나씩 존재, 스레드가 시작할 때 할당된다.
- 추가적으로 스레드를 생성하지 않았다면, main 스레드만 존재 (JVM 스택도 하나이다.)
- 메소드를 호출할 때 마다 프레임을 추가(push) 하고, 메소드 종료 시 해당 프레임 제거(pop)
(예외 발생 시 printStackTrace( ) 메소드로 Stack Trace의 각 라인은 하나의 프레임을 표현한다.)
- 프레임 안에는 로컬 변수 스택이 있다. (기본 타입 변수, 참조 타입 변수가 추가(push) / 삭제(pop)된다.)
변수가 최초로 초기화될 때 로컬 변수 스택에 생성된다.
(변수는 선언된 블록 안에서만 스택에 존재, 블록을 벗어나면 스택에서 제거된다.)
ex)
char v1 = 'A'; // 1
if (v1 == 'A') { // 2
int v2 = 100;
double v3 = 3.14;
} // 2 종료
boolean v4 = true; // 3
int[] scores = {10, 20, 30}; // 4
스택 영역 | 힙 영역 5 번지 : 10, 20, 30 |
|||
실행 1 | 실행 2 | 실행 3 | 실행 4 | |
v1 : A | v3 : 3.14 v2 : 100 v1 : A |
v4 : true v1 : A |
scores : 5 번지 v4 : true v1 : A |
3. 참조 변수의 ==, != 연산
기본 타입 변수 : 변수의 값이 같은지 아닌지 검사
참조 타입 검사 : 동일한 객체를 참조하는지 검사
(주소 번지 값 비교 : 동일 객체 참조 true / 다른 객체 참조 false)
ex)
스택 영역 | 힙 영역 |
refVar1 : 15 번지 refVar2 : 20 번지 refVar3 : 20 번지 |
15 번지 : 객체 1 20 번지 : 객체 2 |
refVar1 == refVar2 // false
refVar1 != refVar2 // true
refVar2 == refVar3 // true
refVar2 != refVar3 // false
4. null 과 NullPointerException
참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있다.
null 값도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택영역에 생성된다.
ex)
스택 영역 | 힙 영역 |
refVar1 = 25 번지 refVar2 = null |
25 번지 : 객체 1 |
참조 타입 변수가 null 인지 확인하려면 ==, != 비교 연산을 수행한다.
refVar1 == null // false
refVar1 != null // true
refVar2 == null // true
refVar2 != null // false
예외(Exception) : 실행 도중 발생하는 오류로 사용자의 잘못된 입력, 잘못된 코드 작성 등으로 발생한다.
NullPointerException : 참조 타입을 잘못 사용하면 발생
참조 타입이 null 값을 가지고 있을 경우 참조 타입 변수는 참조할 객체가 없으므로 사용할 수 없다.
null 값을 가지고 있는 참조 타입 변수를 사용하면 NullPointerException이 발생한다.
int[ ] intArray = null; // 배열 타입 참조 변수
int Array[0] = 10; // NullPointerException 발생! (참조하는 배열 객체가 없다)
String str = null; // 문자열 타입 참조 변수
System.out.println("총 문자 수 : " + str.length()); // NullPointerException 발생!
str 변수가 참조하는 String 객체가 없다. (프로그램 실행 중 예외 발생)
'Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어] > 3. 참조 타입' 카테고리의 다른 글
6. Java 자바 참조 타입 - 다차원 배열 (0) | 2020.05.07 |
---|---|
5. Java 자바 참조 타입 - 커맨드 라인 입력 (String[] args 용도) (0) | 2020.05.06 |
4. Java 자바 참조 타입 - 배열 길이 (0) | 2020.05.06 |
3. Java 자바 참조 타입 - 배열 (0) | 2020.05.05 |
2. Java 자바 참조 타입 - String (문자열) (0) | 2020.04.30 |