220602 참조 타입(Reference Type)

Gukbbap·2022년 12월 8일
0

[기초]JAVA

목록 보기
5/5

참조 타입(Reference Type)이란 객체(Object)의 번지를 참조하는 타입으로

배열, 열거, 클래스, 인터페이스를 말한다.

기본 타입인 byte, char, short, int, long, float, double, boolean 변수는 실제 값을 변수 안에 저장하지만

참조 타입인 배열, 열거, 클래스, 인터페이스 변수는 메모리의 번지를 변수안에 저장한다.

메모리의 번지를 통해서 객체를 참조한다는 뜻에서 참조타입이라고 부른다.

다시 말하자면 기본 타입은

아래와 같이 메소드 내에 변수타입이 선언되고 초기화 값을 지정해 주지만

참조 타입은

이해하기 쉽게 설명하자면 상기 표와 같이 초기화 된 값이 별도의 메모리 영역에 주소를 가지고 저장되는 것이다.

이처럼 번지(주소)를 통해 객체를 참조하기 때문에 String 클래스 변수를 참조 타입 변수라고 한다.

메모리 사용영역

1) 메소드 영역(Method Area)

메소드 영역은 JVM(java Virtual Machine)이 시작될 때 생성되고

모든 스레드(코드에 사용되는 클래스들)가 공유하는 영역이다. 

메소드 영역에는 코드에 사용 되는 클래스들을 클래스로더(class Loader)로 읽어

클래스별로 정적필드(Static field)와 상수(Constant), 메소드 코드(Method code), 생성자 코드(Constructor code)

등으로 분류하여 저장하게 된다.

2) 힙 영역 (Heap Area)

힙 영역은 객체와 배열이 생성되는 영역이다.

여기에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조(메모리 주소에 저장된 객체주소)

 하게 된다.

만약 참조하는 변수나 필드가 없다면 의미없는 객체가 되기에

  JVM은 Garbage Collector(쓰레기수집기)를 실행시켜 자동으로 제거한다.

3) JVM 스택 영역

JVM 스택은 메소드를 호출할 때마다 프레임(Frame)을 추가(Push)하고
메소드가 종료되면 해당 프레임을 제거(Pop)하는 동작을 수행하게 된다.

프레임 내부에는 로컬변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 추가(Push) 되거나

제거(Pop)된다. 

스택 영역의 변수가 생성되는 시점은 최초로 변수에 값이 저장될 때이다.

선언된 변수는 블록 안에서만 존재하고 블록을 벗어나면 스택에서 제거 된다.

4) 참조변수의 ==, != 연산

기본 타입 변수의 ==, != 연산은 변수의 값이 같은지, 다른지를 확인하지만,

참조 타입 변수들간의 ==,!= 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용된다.

결국 ==, != 연산은 기존에 생성된 객체의 주소(번지)값을 비교하는 것이다.

  비교한다는 것은 동일한 객체를 참조한다는 의미가 되겠다.

5) null과 NullPointerException

참조 타입 변수는 힙 영역의 객체를 참조하지 않는 다는 뜻으로 null(널) 값을 가질 수 있다.

 null값도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다.

6) String 타입

자바는 문자열을 String 변수에 저장하기 때문에 String 변수를 우선 선언해야 한다.

 자바는 문자열이 동일하다면 String 객체를 공유하도록 되어 있다.

만약 다음과 같이 변수 1(name1)과 변수 2(name2)가 동일한 문자열을 참조할 경우

변수 1과 변수 2는 동일한 String 객체를 참조하게 된다.

profile
Johannes

0개의 댓글