본문 바로가기

Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어]/3. 참조 타입

1. Java 자바 - 메모리 사용영역, 참조 타입 변수 특징

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이 시작되면 운영체제에게서 할당 받은 메모리 영역을 세부 영역으로 구분해서 사용한다.

 

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 객체가 없다. (프로그램 실행 중 예외 발생)